下图描述了ELF可重定位目标文件的格式:
我们知道.rel.text
和.rel.data
部分包含重新定位条目,链接器需要重新定位这些条目才能生成最终的可执行文件。
我的问题是,为什么要区分.rel.text
和.rel.data
部分?我们可以将.rel.text
和.rel.data
部分合并为一个部分(例如.rel
),这不是更简洁吗?我们只需要在重定位条目结构(Elf64_Rela
)中添加一位来指示重定位条目是与函数(.text
)还是全局变量(.data
)相关?
发布于 2020-08-31 23:18:25
在可重定位(.o
) ELF文件(与具有动态重定位的链接可执行文件或共享库文件相反)中,没有统一的地址空间;所有地址都是相对于特定部分的。因此,每个包含重定位的段都需要自己的重定位表,其地址将相对于该段的基址。
正如您所要求的,对于每个重定位,只有一个位表示它是用于.text
还是.data
是不够的,因为这只是潜在的无限(好吧,仅受索引大小和其他此类约束的限制)部分数量中的两个。例如,对于-ffunction-sections
和/或-fdata-sections
,每个函数或数据对象将驻留在它自己的部分中(因此需要它自己的重新定位表)。有了调试信息,每个与调试相关的部分也需要自己的重新定位。展开表格也是如此。诸若此类。
因此,为了避免有多个表,您需要的不只是一个位,而是每个重新定位的整个区段索引。这是一个巨大的O(n)
(这里的n
是重新定位的数量)大小的成本,而仅仅是O(1)
(对于固定数量的部分)或O(m)
(其中m
是部分的数量,它远远小于任何合理使用中的重新定位的数量)成本。
https://stackoverflow.com/questions/63672744
复制相似问题