为什么 nm 隐藏 .o 文件中的 .rela.eh_frame 和 .rela.text ?

aih*_*hya 3 c elf relocation nm

我试图nm在 C 中重新创建该命令的行为,尽管我成功获取了符号和部分的名称,但我发现我的版本中出现了一些额外的名称。

$> ./my_nm -a obj.o

0000000000000000 b .bss
0000000000000000 n .comment
0000000000000000 d .data
0000000000000000 r .eh_frame
0000000000000000 n .note.GNU-stack
0000000000000000 r .note.gnu.property
0000000000000000 d .rela.eh_frame
0000000000000000 d .rela.text
0000000000000000 t .text
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T elf64_syms
0000000000000000 a elf64_syms.c
                 U malloc
Run Code Online (Sandbox Code Playgroud)

$> nm -a obj.o

0000000000000000 b .bss
0000000000000000 n .comment
0000000000000000 d .data
0000000000000000 r .eh_frame
0000000000000000 n .note.GNU-stack
0000000000000000 r .note.gnu.property
0000000000000000 t .text
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T elf64_syms
0000000000000000 a elf64_syms.c
                 U malloc
Run Code Online (Sandbox Code Playgroud)

我对它们做了一些研究,发现它们是对某个部分或符号的某种引用。我想知道他们有什么特别的地方吗?如果是这样,我如何区分它们和其他.rela...

Emp*_*ian 5

我发现我的版本中出现了一些额外的名称。

Linuxnm版本使用libbfd,它将不同的目标文件格式映射到它自己的内部数据模型中,然后nm打印该内部表示。

libbfdELF至少早了 20 年,并且其内部模型不足以表示格式的复杂性ELF(翻译中会丢失内容)。

出于这个原因,人们通常不应该使用nm,objdump和其他libbfd基于工具来检查ELF文件(而是使用它,它会按readelf原样显示内容,而不会造成翻译损失)。

所以,你没有做错任何事,你的版本nm更好