我是Linux系统的初学者,正在研究阅读此文档的ELF文件格式(http://www.skyfree.org/linux/references/ELF_Format.pdf)。但是,当我看到有关搬迁的相关文档时,搬迁计算中会出现奇怪的事情。我知道根据重定位类型,它适用于不同的计算方式。但是看看这个。
当R型是R_386_RELATIVE时,此文档说明了计算“ B + A”的方法。但是,“ A”的确切含义是什么?以及如何在ELF文件中获得此“ A”值?
请给我您仁慈的答复。
从您提到的文档中:
R_386_RELATIVE
链接编辑器创建此重定位类型以进行动态链接。它的偏移量成员在共享对象中提供一个位置,该位置包含代表相对地址的值。动态链接器通过将 共享对象加载到的虚拟地址添加到相对地址中来计算相应的虚拟地址。此类型的重定位条目必须为符号表索引指定0。
一种
这意味着用于计算可重定位字段的值的加数。
乙
这意味着在执行过程中共享对象已加载到内存中的基址。通常,共享目标文件是用0个基本虚拟地址构建的,但是执行地址会有所不同。
加数
如上所示,只有
Elf32_Rela
条目包含显式addend。Elf32_Rel类型的条目在要修改的位置存储一个隐式加数。根据处理器体系结构,一种形式或另一种形式可能是必需的或更方便的。因此,特定机器的实现可以根据上下文使用一种形式,也可以只使用一种形式。基址
为了计算基地址,需要确定与段的最低
p_vaddr
值关联的内存地址PT_LOAD
。然后,通过将内存地址截断为最大页面大小的最接近倍数来获得基址。根据加载到内存中文件的类型,内存地址可能与p_vaddr
值不匹配。
因此归结为下一个:
Elf32_Rel
或Elf32_Rela
结构计算p_vaddr
。具体的计算取决于体系结构。您可以使用观察某些二进制/库文件的重定位部分readelf -r
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句