ELF中SHT_NULL节的用途是什么?

dae*_*155 5 elf

  1. SHT_NULL节的目的是什么ELF
  2. 它是由OS还是加载器引用的?
  3. 这部分的大小是多少?
  4. 它和NULL指针有关系吗?
  5. 另外,为什么本节在节段映射中没有条目?

根据ELF规范:

SHT_NULL:此值将节标题标记为无效;它没有关联的部分。节标题的其他成员具有未定义的值。

Emp*_*ian 7

elf 中 SHT_NULL 部分的用途是什么?

它充当哨兵

是被操作系统还是加载器引用的?

不。

该部分的大小是多少?

零(您可以在输出中看到readelf -WS a.out)[但见下文]。

为什么此部分在节段映射中没有条目?

因为该部分不存在于任何段中。


通常,每个 ELF 文件中的第一个部分的类型为SHT_NULL. 理论上,链接后工具也可以将某些其他部分的类型设置为SHT_NULL(例如,如果不再需要其数据),并且所有后续工具都应该忽略该部分。这并不常见。

  • 为什么需要这个哨兵?所有偏移量/尺寸都没有明确指定吗? (2认同)

Cir*_*四事件 5

的一个“用途”SHT_NULL是它对于第一个头表条目(索引 0,named SHN_UNDEF)是强制性的,这很神奇。

这记录在System V ABI 更新由 LSB推荐)中:

如果节数大于或等于 SHN_LORESERVE (0xff00),则 e_shnum 的值为 SHN_UNDEF (0),节头表条目的实际数包含在索引 0 处的节头的 sh_size 字段中(否则, sh_size 成员的初始条目包含 0)。

和:

保留其他节类型值。如前所述,索引 0 (SHN_UNDEF) 的节头存在,即使该索引标记了未定义的节引用。此条目包含以下内容。

后跟一个表,指定节头的每个条目在这种特殊情况下的含义。特别是,sh_type必须是SHT_NULL

从上面来看,这第一部分似乎存在以允许对大量部分进行编码,但我还没有测试内核和编译器支持。