如何解决为什么要区分.rel.text和.rel.data节?
我们知道.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(n)
(对于固定数目的段)或n
(其中{{1 }}是段的数量,比以任何合理的用法完成操作的成本要少得多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。