objdump 输出格式解析

这篇文章详细解释了objdump命令的两种常见选项--syms和-T--dynamic-syms的输出格式,包括符号的类型、地址、节、标志位以及动态符号的相关信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/download/SimpleForest/89251966

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值