我们知道 .rel.text和.rel.data部分包含链接器需要重定位以生成最终可执行文件的重定位条目。
我的问题是,为什么要区分.rel.text和.rel.data分段?是不是更简洁,我们可以结合.rel.text和.rel.data部分成一个部分(例如.rel)?我们只需要在重定位条目 struct ( Elf64_Rela) 中添加一个位来指示重定位条目是与函数 ( .text) 还是全局变量 ( .data) 相关?
在可重定位 ( .o) ELF 文件中(与具有动态重定位的链接可执行文件或共享库文件相反),没有统一的地址空间;所有地址都与特定部分相关。因此,其中包含重定位的每个部分都需要自己的重定位表,其地址将相对于该部分的基址。
正如您所要求的那样,为每个重定位设置一个位是不够的,指示它是用于.text还是.data因为这些只是潜在无限(好吧,仅受索引大小和其他此类约束的限制)数量的部分中的两个。例如使用-ffunction-sections和/或-fdata-sections,每个函数或数据对象将驻留在它自己的部分(因此需要它自己的重定位表)。对于调试信息,每个与调试相关的部分也需要自己的重定位。放松表也是如此。等等。
因此,为了避免有多个表,对于每个重定位,您不仅需要一位,还需要一个完整的节索引。这是一个巨大的O(n)(这里n是重定位的数量)大小成本与O(1)(对于固定数量的部分)或O(m)(其中m是部分的数量,这远小于任何合理使用中的重定位数量)成本它的完成方式。
| 归档时间: |
|
| 查看次数: |
717 次 |
| 最近记录: |