为什么objdump不显示.bss,.shstratab,.symtab和.strtab部分?

我目前正在C中执行自己的objdump实现。

对于我的-s选项,我必须显示ELF文件部分的全部内容。

我做得很好,但我显示的部分比“真正的”objdump更多。

实际上,它不会输出.bss,.shstrtab,.symtab和.strtab部分。

我正在寻找Shdr结构上的sh_flags值,但我找不到任何逻辑……

为什么objdump -s没有显示这些部分?

为什么objdump -s没有显示这些部分?

Objdump基于libbfd ,它抽象出ELF的许多复杂性,并且当对象倾向于只有三个部分时编写。

因此, objdump非常缺乏 。 除了没有显示(某些)现有部分之外,它还可能“合成”根本不存在的部分,并做其他奇怪的技巧。 这更像是一个libbfd错误 – 它的抽象层根本不告诉objdump关于“缺失”的部分。

TL; DR:不要使用objdump 。 请改用readelf

尝试使用sh_size和sh_type,而不是sh_flags。

引用ELF规范

sh_size该成员给出了部分的大小(以字节为单位)。 除非节类型是SHT_NOBITS,否则该节在文件中占用sh_size字节。 SHT_NOBITS类型的一部分可能具有非零大小,但它在文件中不占用空间