objdump 输出格式解析
文章主要翻译自https://www.man7.org/linux/man-pages/man1/objdump.1.html,为提高工作效率翻译借助了AI工具,并进行简单修改
一、objdump 选项
1.
-t
--syms
打印文件的符号表
另外一种常见的输出格式,通常出现在基于ELF的文件中,如下所示:
00000000 l d .bss 00000000 .bss
00000000 g .text 00000000 fred
在这里,第一个数字是符号的值(有时被称为它的地址)。接下来的字段实际上是一组字符和空格,表示符号的标志位。这些字符将在下面描述。接下来是与符号关联的节,如果是绝对节(即不与任何节连接),则显示为 ABS,如果是未定义但在文件中引用的节,则显示为 UND。
节名之后是另一个字段,一个数字,对于大多数符号来说是对齐字节数,对于其他符号是大小。最后显示符号的名称。
标志字符分为以下7组:
"l"
"g"
"u"
"!"
符号可以是局部的(l),全局的(g),唯一的全局(u),既不是全局也不是局部(空格),或者既是全局又是局部(!)。符号既不是局部的也不是全局的,可能是由于各种原因,例如它用于调试,但如果它既是局部的又是全局的,也可能是出错了。唯一的全局符号是GNU对标准ELF符号集的扩展。对于这样的符号,动态链接器将确保在整个进程中只有一个具有此名称和类型的符号被使用。
"w" 符号是弱符号(w)或者强符号(空格)
"C" 符号是构造符号(C)或者原始符号(空格)
"W" 符号是一个警告(W)或者一个普通符号(空格)。警告符号的名称是一个如果跟随警告符号的符号被引用时要显示的消息。
"I"
"i"
符号是对另一个符号的间接引用(I),在重定位期间需要处理的函数(i),或者是一个普通符号(空格)。
"d"
"D"
符号是一个调试符号(d)、一个动态符号(D)或者一个普通符号(空格)。
"F"
"f"
"O"
符号是函数名(F)、文件名(f)、对象名(O)或者只是一个普通符号(空格)。
2.
-T
--dynamic-syms
打印文件的动态符号表。这只对动态对象有意义,比如某些类型的共享库。这与nm使用 -D (–dynamic) 选项时提供的信息相似。
输出格式与 --syms 选项产生的格式相似,不同之处在于在符号名称前插入了一个额外的字段,给出了与符号关联的版本信息。如果该版本是用于解析对符号的无版本引用时的默认版本,则直接显示;否则将其放入括号中。
二、示例
$ objdump -TtC libalg.so
libalg.so: file format elf64-x86-64
SYMBOL TABLE:
0000000000001040 l F .text 0000000000000000 deregister_tm_clones
0000000000000000 l df *ABS* 0000000000000000 add.cpp
0000000000004028 l O .bss 0000000000000004 TestFun(int, int)::s_sum
0000000000000000 l df *ABS* 0000000000000000 sub.cpp
0000000000000000 w *UND* 0000000000000000 __cxa_finalize
0000000000001135 g F .text 0000000000000016 Sub(int, int)
00000000000010f9 g F .text 0000000000000024 TestFun(int, int)
0000000000004024 g O .bss 0000000000000004 g_value
0000000000000000 w *UND* 0000000000000000 __gmon_start__
DYNAMIC SYMBOL TABLE:
0000000000000000 w D *UND* 0000000000000000 __gmon_start__
00000000000010f9 g DF .text 0000000000000024 TestFun(int, int)
0000000000004024 g DO .bss 0000000000000004 g_value
000000000000111d g DF .text 0000000000000018 Add(int, int)
0000000000001135 g DF .text 0000000000000016 Sub(int, int)
上面是一个动态库,
第一列表示符号的值或者地址,
第二列 l(local)表示局部符号,w(weak)表示弱符号,g(global)表示全局符号;
第三列 F(Function)表示该符号是函数,f(file)表示是一个文件名称,add.cpp是库的一个文件,O(Object)表示是目标名,D(Dynamic)表示动态符号,动态符号简单可以理解为动态库导出的符号;
第四列表示符号所属的段,*UND*(undefine)表示该符号在该文件中未定义,是引用的其他地方的。__gmon_start__是引用的其他库的函数,在本库中未定义。Add则是本库定义的函数。
本文测试代码:https://download.csdn.net/download/SimpleForest/89251966