我怎样才能获得ELF文件的值?

时间:2015-03-02 09:05:00

标签: linux elf

我是Linux系统的初学者,我正在学习读取此文档的ELF文件格式(http://www.skyfree.org/linux/references/ELF_Format.pdf)。 但是,当我看到有关重新定位的相关文档时,重定位计算中存在奇怪的事情。 我知道根据重定位类型,它采用不同的方式来计算。 但看看这个。

当R-type为R_386_RELATIVE时,本文档说明了计算“B + A”的方法。 然而,“A”究竟是什么意思?如何在ELF文件中获得此“A”值?

请给我你的怜悯答案.......;

1 个答案:

答案 0 :(得分:2)

从您提到的文件:

  

<强> R_386_RELATIVE

     

链接编辑器为动态链接创建此重定位类型。其偏移成员在共享对象中提供一个位置,该位置包含表示相对地址的值。动态链接器通过 加载共享对象的虚拟地址添加到相对地址来计算相应的虚拟地址。此类型的重定位条目必须为符号表索引指定0。

     

<强> A

     

这意味着加数用于计算可重定位字段的值。

     

<强>乙

     

这意味着执行期间共享对象已加载到内存中的基址。通常,共享对象文件使用0基本虚拟地址构建,但执行地址将不同。

     

<强>加数

     

如上所示,只有 Elf32_Rela 条目包含显式加数`Elf32_Rel 类型的条目在要修改的位置存储隐式加数。根据处理器架构,可能需要一种形式或另一种形式或更方便。因此,特定机器的实现可以使用一种形式,也可以根据上下文使用任何一种形式。

     

基地址

     

要计算基址,可以确定与 p_vaddr 段的最低 PT_LOAD 值关联的内存地址。然后,通过将存储器地址截断为最大页面大小的最接近倍数来获得基址。根据加载到内存中的文件类型,内存地址可能与 p_vaddr 值匹配,也可能不匹配。

所以归结为下一个:

  • 加数,并根据 Elf32_Rel Elf32_Rela 结构<进行计算/ LI>
  • B 基地,并从 p_vaddr 计算得出。具体计算取决于架构。

您可以使用readelf -r观察某些二进制文件/库文件的重定位部分。