【问题标题】:why differentiate .rel.text and .rel.data section?为什么要区分 .rel.text 和 .rel.data 部分?
【发布时间】:2020-08-31 14:29:14
【问题描述】:

下面是描述ELF可重定位目标文件格式的图片:

我们知道.rel.text.rel.data 部分包含重定位条目,链接器需要重定位这些条目才能生成最终的可执行文件。

我的问题是,为什么要区分 .rel.text.rel.data 部分?我们可以将.rel.text.rel.data 部分合并为一个部分(例如.rel)不是更简洁吗?我们只需要在重定位条目结构(Elf64_Rela)中添加一个位来指示重定位条目是与函数(.text)还是全局变量(.data)相关?

【问题讨论】:

  • 重定位条目并没有真正可以窃取的空闲位,但是为什么您仍然需要 O(n) 额外存储而不是 O(1)?
  • 因为 .text 是只读的,而 .data 是读/写的,所以您需要将它们分开,以便它们可以正确链接。是的,在某些情况下,它们可以简单地进入相同的内存空间,但为什么要从程序员手中夺走控制权呢?
  • @old_timer:这不是文本/数据部分本身,只是为它们保存重定位的部分。
  • 通常可以为 .data 和 .text 和 .bss 提出相同的论点
  • 你需要知道它们的区别,这样你才能加载/放置/链接/等它们。

标签: c gcc linker elf


【解决方案1】:

在可重定位 (.o) ELF 文件中(相对于链接的可执行文件或具有动态重定位的共享库文件),没有统一的地址空间;所有地址都与特定部分相关。因此,每个包含重定位的部分都需要自己的重定位表,其地址将相对于该部分的基址。

正如您所要求的那样,对于每个重定位只有一个位来指示它是用于 .text 还是 .data 是不够的,因为它们只是可能无限的两个(好吧,仅受索引大小和其他此类限制)部分的数量。例如,使用-ffunction-sections 和/或-fdata-sections,每个函数或数据对象都将驻留在其自己的部分中(因此需要自己的重定位表)。并且使用调试信息,每个与调试相关的部分也需要自己的重定位。放松桌子也是如此。以此类推。

因此,为了避免拥有多个表,您不仅需要一个位,而且每次重定位都需要一个完整的节索引。与O(1)(固定数量的部分)或O(m)(其中m是部分的数量,即远低于任何合理使用中的重定位次数)按照它的方式进行操作的成本。

【讨论】:

猜你喜欢
  • 2020-12-18
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 2021-04-25
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多