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