为什么要区分 .rel.text 和 .rel.data 部分?

why differentiate .rel.text and .rel.data section?

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

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

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

在relocatable (.o) ELF文件中(相对于linked executable or shared library files with dynamic relocations),没有统一地址space;所有地址都与特定部分相关。因此,每个包含重定位的部分都需要自己的重定位 table,其地址将相对于该部分的基址。

正如您所要求的,对于每个重定位都有一个位来指示它是针对 .text 还是 .data 是不够的,因为它们只是潜在无限(好吧,有限)中的两个仅根据索引的大小和其他此类约束)部分的数量。例如 -ffunction-sections and/or -fdata-sections,每个函数或数据对象将驻留在其自己的部分(因此需要其自己的重定位 table)。有了调试信息,每个 debugging-related 部分也需要自己的重定位。展开 tables 也是如此。等等。

因此,为了避免有多个 table,您需要的不仅仅是一位,而是每次重定位的整个部分索引。与 O(1)(对于固定数量的部分)或 O(m)(其中 m 是节数,这比任何合理使用中的重定位数要少得多)按原样做的成本。