objdump的符号表每一列的含义是什么?

77
SYMBOL TABLE:
0000000000000000  w      *UND*  0000000000000000              __gmon_start__

我已经运行了man objdump,但是没有这样的信息。

有人知道5列的含义是什么吗?

5个回答

106

第一列:符号的值

第二列:一组字符和空格,指示在符号上设置的标志位。下面列出了七个分组:

第一组:(l,g,!)本地、全局、无两者,两者都不是。

第二组:(w,)弱或强符号。

第三组:(C,)符号表示构造函数或普通符号。

第四组:(W,)符号为警告或正常符号。

第五组:(I,)间接引用另一个符号或正常符号。

第六组:(d,D,)调试符号、动态符号或正常符号。

第七组:(F,f,O,)符号是函数、文件、对象的名称或正常符号。

第三列:符号所在的段,“ABS”表示与特定段无关联

第四列:符号的大小或对齐方式。

第五列:符号的名称。

如果您需要更多信息,请查看手册页或以下链接:https://manpages.ubuntu.com/manpages/kinetic/en/man1/objdump.1.htmlhttps://sourceware.org/binutils/docs/binutils/objdump.html


2
只是想知道,对于第四列,通常表示的大小是什么?我们看的是字节还是位? - Zhouster
@Zhouster,为了加快符号表加载的速度,我认为在32位系统中应该进行4字节对齐。 - gzh
@Zhouster。始终是字节,永远是字节。 - antred
答案中的链接现在重定向到https://manpages.ubuntu.com/manpages/kinetic/en/man1/objdump.1.html和https://sourceware.org/binutils/docs/binutils/objdump.html-我稍后会编辑以更新它们,但是编辑队列现在已满。 - AJM
关于我的上面的评论 - 队列并没有满,所以我刚刚提交了那个编辑。 - AJM

10

由于之前的回答似乎都不正确,这里是您实际寻找的内容:

以下是来自链接的一段代码片段,可能会有所帮助:

"通常在基于ELF文件的情况下看到的另一种常见输出格式如下:

      00000000 l    d  .bss   00000000 .bss
      00000000 g       .text  00000000 fred

这里的第一个数字是符号的值(有时称为地址)。下一个字段实际上是一组字符和空格,指示设置在符号上的标志位。这些字符如下所述。接下来是与符号关联的部分,如果该部分是绝对的(即与任何部分不相关),则为ABS,如果该部分在正在转储的文件中被引用但未在其中定义,则为UND

在节名称之后,另一个字段是一个数字,对于常规符号,它是对齐方式,而对于其他符号,则是大小。最后显示符号的名称。


7

objdump -t打印文件的符号表项。
输出类似于nm程序提供的信息。

输出结果中有7列

  • value(值)
  • class(类)
  • type(类型)
  • size(大小)
  • line(行)
  • section(节)
  • symbol-name(符号名称)

(某些条目可能有空列)

objdump最左列中打印符号名称
nm最右列中打印符号名称


1
(某些条目可能存在空列)这太糟糕了。如果某个特定列甚至没有值,而且也没有分隔符,那么他们怎么想象人们可以轻松解析符号表呢?:-(( - antred
使用以下正则表达式找到了一种方法:^((?xi)[a-f0-9]+)\s+([lgu!])([w ])([C ])([W ])([Ii ])([dD ])([FfO ])\s+(\S+)\s+((?xi)[a-f0-9]+)\s+(\S+)$ - antred

4

nmobjdump 有什么关系? - Je Rog
@Shadow Wizard,Class w 代表什么? - Je Rog
@Je 抱歉,我不知道,只是编辑了答案以便更好地格式化。 - Shadow The Spring Wizard
我在这里找到了我要找的东西,真是太有用了,谢谢 :) - yota

0
man7.org的objdump手册中关于选项-t的描述中,格式如下所述:

通常在基于ELF的文件中看到的另一种常见输出格式如下:

              00000000 l    d  .bss   00000000 .bss
              00000000 g       .text  00000000 fred

这里的第一个数字是符号值(有时称为地址)。接下来的字段实际上是一组字符和空格,用于指示在符号上设置的标志位。这些字符如下所述。接下来是与符号关联的部分,如果该部分是绝对的(即与任何部分都没有连接),则为*ABS*,如果该部分被引用但未在文件中定义,则为*UND*。在部分名称之后,另一个字段是一个数字,对于公共符号,它是对齐方式,对于其他符号则是大小。最后显示符号的名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接