我目前正在做一个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
库,但没有看到可以确定字符的字段。
答案1
nm
主要根据符号出现的部分来选择字符。 ELF 指定于系统 V ABI;第 4-22 页及后续内容描述了符号表,其中包括两个字段st_info
和st_shndx
,这些字段确定显示的字符nm
。
符号绑定 ( ELF32_ST_BIND(st_info)
) 确定该符号是局部符号( 中的小写nm
)、全局符号(大写)还是弱符号 ( v
, w
)。sh_shndx
指向包含该符号的部分,并且许多nm
s 字符反映了这一点,要么作为显式部分 ( b
, d
...),要么作为具有特殊含义的值 (例如 u
对于SHN_UNDEF
,未定义的符号)。
因此,您不会找到直接对应于 所示字符的单个值nm
,但上面应该为您提供足够的信息来解释 ABI 规范中描述的值。