我是Linux系统的初学者,我正在学习读取此文档的ELF文件格式(http://www.skyfree.org/linux/references/ELF_Format.pdf)。 但是,当我看到有关重新定位的相关文档时,重定位计算中存在奇怪的事情。 我知道根据重定位类型,它采用不同的方式来计算。 但看看这个。
当R-type为R_386_RELATIVE时,本文档说明了计算“B + A”的方法。 然而,“A”究竟是什么意思?如何在ELF文件中获得此“A”值?
请给我你的怜悯答案.......;
答案 0 :(得分:2)
从您提到的文件:
<强>
R_386_RELATIVE
强>链接编辑器为动态链接创建此重定位类型。其偏移成员在共享对象中提供一个位置,该位置包含表示相对地址的值。动态链接器通过将 加载共享对象的虚拟地址添加到相对地址来计算相应的虚拟地址。此类型的重定位条目必须为符号表索引指定0。
<强> A 强>
这意味着加数用于计算可重定位字段的值。
<强>乙强>
这意味着执行期间共享对象已加载到内存中的基址。通常,共享对象文件使用0基本虚拟地址构建,但执行地址将不同。
<强>加数强>
如上所示,只有
Elf32_Rela
条目包含显式加数。 `Elf32_Rel 类型的条目在要修改的位置存储隐式加数。根据处理器架构,可能需要一种形式或另一种形式或更方便。因此,特定机器的实现可以使用一种形式,也可以根据上下文使用任何一种形式。基地址
要计算基址,可以确定与
p_vaddr
段的最低PT_LOAD
值关联的内存地址。然后,通过将存储器地址截断为最大页面大小的最接近倍数来获得基址。根据加载到内存中的文件类型,内存地址可能与p_vaddr
值匹配,也可能不匹配。
所以归结为下一个:
Elf32_Rel
或 Elf32_Rela
结构<进行计算/ LI>
p_vaddr
计算得出。具体计算取决于架构。您可以使用readelf -r
观察某些二进制文件/库文件的重定位部分。