gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:34:26 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

关于c - 为什么要区分 .rel.text 和 .rel.data 部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63672744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com