我目前正在做一个nm
类似的程序,以打印 ELF 文件的符号及其地址和类型。
典型的输出类似于:
$ nm ./my_exec
0000000000003d28 d _DYNAMIC
0000000000003f28 d _GLOBAL_OFFSET_TABLE_
0000000000002000 R _IO_stdin_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
第一列是符号地址,第二列是符号类型,第三列是符号名称。
man 表示每个字符的含义,大写是全局符号,小写是局部符号等...
但我不明白它如何选择使用哪个字符。
我正在使用该Gelf
库,但没有看到可以确定角色的字段。
nm
主要根据符号出现的部分选择字符。ELF 在System V ABI中指定;第 4-22 页及以下描述了符号表,其中包括两个字段,st_info
和st_shndx
,它们确定由 显示的字符nm
。符号绑定 (
ELF32_ST_BIND(st_info)
) 确定符号是局部的(小写的nm
)、全局的(大写的)还是弱的 (v
,w
)。sh_shndx
指向包含符号的部分,许多nm
' 字符反映了这一点,或者作为显式部分(b
,d
...),或者作为具有特殊含义的值(例如u
forSHN_UNDEF
,未定义的符号)。因此,您不会找到与 显示的字符直接对应的单个值
nm
,但上面应该为您提供足够的信息来解释 ABI 规范中描述的值。