如何通过objdump -t输出区分局部符号与全局符号
问题场景
在Windows 10环境下使用g++ -c编译生成目标文件后,执行objdump -t查看符号表会得到如下格式的输出:
[ 4](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .bss [ 6](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 fred
上述格式各字段含义:方括号内数字为符号表条目编号,
sec字段为节区编号,fl字段为符号标志位,ty字段为符号类型,scl字段为符号存储类,nx字段为符号关联的辅助条目数量,最后两个字段分别为符号的值与符号名称。
已知ELF格式文件执行objdump -t时,输出会直接用l标记局部符号、g标记全局符号,能实现类似nm命令通过简单标识快速区分符号绑定属性的效果,ELF格式的输出样例如下:
00000000 l d .bss 00000000 .bss 00000000 g .text 00000000 fred
但Windows下生成的COFF格式目标文件对应的objdump输出没有这类直接标识,需要找到方法快速区分输出内容里的局部、全局符号。
解决方法
有两种可落地的方案,都能实现类似nm的符号属性快速判断效果:
- 直接基于现有输出的
scl字段判断,不需要额外工具:
COFF格式符号表中,scl(符号存储类)字段直接标记了符号的绑定属性:scl = 2(对应COFF规范定义的C_EXT外部符号):全局符号,可被其他目标文件引用scl = 3(对应COFF规范定义的C_STAT静态符号):局部符号,仅在当前目标文件内可见
对照开头的样例输出,.bss条目scl值为3属于局部符号,fred条目scl值为2属于全局符号,判断结果和ELF格式的l/g标识完全一致。
- 如果不想记忆字段映射规则,可以使用Dumpbin.exe工具查看符号表。该工具输出逻辑清晰易懂,会直接明确标注每个符号的绑定属性、所属节区、类型等信息,不需要手动做字段解析。
内容的提问来源于stack exchange,提问作者shiyon sufa
相关产品推荐
相关产品推荐

