![`nm` 如何为每种符号类型选择要打印的字符?](https://linux22.com/image/203450/%60nm%60%20%E5%A6%82%E4%BD%95%E4%B8%BA%E6%AF%8F%E7%A7%8D%E7%AC%A6%E5%8F%B7%E7%B1%BB%E5%9E%8B%E9%80%89%E6%8B%A9%E8%A6%81%E6%89%93%E5%8D%B0%E7%9A%84%E5%AD%97%E7%AC%A6%EF%BC%9F.png)
我目前正在做一个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 规范中描述的值。