首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么要区分.rel.text和.rel.data部分?

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

Stack Overflow用户
提问于 2020-08-31 22:29:14
回答 1查看 877关注 0票数 2

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-31 23:18:25

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

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

因此,为了避免有多个表,您需要的不只是一个位,而是每个重新定位的整个区段索引。这是一个巨大的O(n) (这里的n是重新定位的数量)大小的成本,而仅仅是O(1) (对于固定数量的部分)或O(m) (其中m是部分的数量,它远远小于任何合理使用中的重新定位的数量)成本。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63672744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档