【问题标题】:Why does objdump not show .bss, .shstratab, .symtab and .strtab sections?为什么 objdump 不显示 .bss、.shstratab、.symtab 和 .strtab 部分?
【发布时间】:2014-04-05 07:39:35
【问题描述】:

我目前正在用 C 语言实现自己的 objdump。

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

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

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

我正在查看 Shdr 结构上的 sh_flags 值,但找不到任何逻辑...

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

【问题讨论】:

  • ELF 相当复杂,GNU objdump 基于 BFD,这是一个负责繁重工作的库(binutils 的一部分)。
  • 是的,我知道 BFD 库。在苹果开源上,我可以看到(section->flags & SEC_HAS_CONTENTS) 显示或不显示该部分。在我的计算机上,.bss 与显示的其他部分具有相同的标志。

标签: c elf objdump


【解决方案1】:

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

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

因此,objdump 相当不足。除了不向您显示(某些)现有部分之外,它还可能“合成”根本不存在的部分,并执行其他奇怪的技巧。这更像是一个libbfd 错误——它的抽象层根本没有告诉 objdump “缺失”的部分。

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

【讨论】:

  • 好的,所以这种行为不是真正想要的吗?对于我的 objdump,我将展示每个部分。谢谢 !顺便说一句,我也更喜欢使用 readelf,objdump 是一个学校项目。
【解决方案2】:

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

引用ELF specification

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

【讨论】:

  • 似乎只有 .bss 和 .got 是 SHT_NOBITS 类型。所以它没有解释为什么 .shstrtab、.symtab 和 .strtab 没有显示出来......
  • 这是我的结论:如果一个部分至少有一个标志(与 .shstrtab、.symtab 和 .strtab 不同)或者他的类型不是 NOBITS(与 .bss 不同),则会显示该部分。有人有其他想法吗?
  • 所以,我找到了一个反例:.gnu_debuglink 没有标志,由 objdump -s 显示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 2019-01-28
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多