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

Why nm hides .rela.eh_frame and .rela.text in .o files?

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

$> ./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

$> 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

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

I find out that some extra names appear in my version.

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

libbfd 早于 ELF 至少 2 个十年,其内部模型 不足以 表示 ELF 格式的复杂性(事情在翻译中丢失了)。

出于这个原因,通常不应该使用nmobjdump和其他基于libbfd的工具来检查ELF 文件(改用 readelf,它显示 原样 ,没有翻译损失。

所以,您没有做错并且您的nm版本更好