You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 09:39:57