【问题标题】:What is the use of the SHT_NULL section in ELF?ELF 中的 SHT_NULL 部分有什么用?
【发布时间】:2014-11-08 00:07:42
【问题描述】:
  1. ELF 中的SHT_NULL 部分的用途是什么?
  2. 是被操作系统引用还是被加载器引用?
  3. 此部分的大小是多少?
  4. NULL指针有关系吗?
  5. 另外,为什么此部分在节段映射中没有条目?

来自 ELF 规范:

SHT_NULL :该值将节标题标记为非活动;它没有关联的部分。节标题的其他成员具有未定义的值。

【问题讨论】:

    标签: elf


    【解决方案1】:

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

    这记录在System V ABI Update(推荐by the LSB):

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

    和:

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

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

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

    【讨论】:

      【解决方案2】:

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

      它用作sentinel

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

      没有。

      这个部分的大小是多少?

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

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

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


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

      【讨论】:

      • 似乎 SHT_NULL 部分在进程映像中没有真正的用途。 elf 中是否有任何部分可用于指示操作系统在内存中保留一个不可分配且非 RWX 区域来处理 NULL 指针异常?
      • @daemon155 我不明白您所说的“处理 NULL 指针异常”是什么意思。最好提出一个新问题,并提供尽可能多的细节。
      • 为什么需要这个哨兵?不是所有的偏移量/尺寸都指定得很好吗?
      • 我不认为它有真正的目的,也不是某事所需要的。我的猜测是它被 ELF 标准定义为第一个条目,也许他们想要一个“虚拟部分和部分标题”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多