Linux 如何获取ELF文件的值?
我是Linux系统的初学者,正在学习ELF文件格式,阅读此文档()。 但当我看到有关搬迁的相关文件时,在搬迁计算中有一些奇怪的事情。 我知道根据搬迁类型,它采用不同的计算方法。 但是看看这个 当R-type是R_386_RELATIVE时,本文档说明了计算“B+A”的方法。 然而,“A”到底是什么意思?我怎样才能在ELF文件中得到这个“A”值Linux 如何获取ELF文件的值?,linux,elf,Linux,Elf,我是Linux系统的初学者,正在学习ELF文件格式,阅读此文档()。 但当我看到有关搬迁的相关文件时,在搬迁计算中有一些奇怪的事情。 我知道根据搬迁类型,它采用不同的计算方法。 但是看看这个 当R-type是R_386_RELATIVE时,本文档说明了计算“B+A”的方法。 然而,“A”到底是什么意思?我怎样才能在ELF文件中得到这个“A”值 请给我你仁慈的回答 来自您提到的文档: R\u 386\u RELATIVE 链接编辑器为动态链接创建此重定位类型。它的offset成员给出了共享对象中的
请给我你仁慈的回答 来自您提到的文档:
R\u 386\u RELATIVE
链接编辑器为动态链接创建此重定位类型。它的offset成员给出了共享对象中的一个位置,该位置包含一个表示相对地址的值。动态链接器通过将加载共享对象的虚拟地址添加到相对地址来计算相应的虚拟地址。此类型的重新定位项必须为符号表索引指定0
A
这意味着用于计算可重定位字段值的加数
B
这意味着在执行过程中将共享对象加载到内存中的基址。通常,共享对象文件是使用0基虚拟地址构建的,但执行地址会有所不同
加数
如上所示,只有Elf32_Rela
项包含显式加数。`Elf32_Rel类型的条目在要修改的位置存储一个隐式加数。根据处理器体系结构的不同,一种或另一种形式可能是必要的或更方便的。因此,特定机器的实现可以独占使用一种形式,也可以根据上下文使用任一形式
基址
要计算基址,需要确定与
段的最低
因此,可以归结为下一步:
- A是加数并根据
Elf32\u Rel
或Elf32\u Rela
结构计算
- B是基址,由
p\U vaddr
计算得出。具体计算取决于架构
你可以用readelf-r
观察某个二进制/库文件的重定位部分,我认为它是相对于当前IP的,即存储该值的内存位置的地址,但我没有文档来证明它。