`nm` 如何为每种符号类型选择要打印的字符?

`nm` 如何为每种符号类型选择要打印的字符?

我目前正在做一个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_infost_shndx,这些字段确定显示的字符nm

符号绑定 ( ELF32_ST_BIND(st_info)) 确定该符号是局部符号( 中的小写nm)、全局符号(大写)还是弱符号 ( v, w)。sh_shndx指向包含该符号的部分,并且许多nms 字符反映了这一点,要么作为显式部分 ( b, d...),要么作为具有特殊含义的值 (例如 u对于SHN_UNDEF,未定义的符号)。

因此,您不会找到直接对应于 所示字符的单个值nm,但上面应该为您提供足够的信息来解释 ABI 规范中描述的值。

相关内容