2015-03-02 22 views
2

我是Linux系统的新手,我正在学习ELF文件格式阅读本文件(http://www.skyfree.org/linux/references/ELF_Format.pdf)。 但是当我看到有关重定位的相关文档时,在重定位计算中存在奇怪的事情。 我知道根据搬迁类型,它应用不同的计算方法。 但看看这个。如何获得ELF文件的值?

当R型为R_386_RELATIVE时,本文档说明计算“B + A”的方式。 但是,“A”的含义是什么?以及如何在ELF文件中获得此“A”值?

请给我你的仁慈答案.......;

+0

从我的头脑开始,我认为它与当前的IP有关,即存储这个值的内存地址,但我没有文档证明它。 – rodrigo 2015-03-02 09:12:04

回答

2

从文档你提到:

R_386_RELATIVE

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

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

这意味着在该执行期间共享对象被加载到存储器中的基地址。通常,共享目标文件是使用0基础虚拟地址构建的,但执行地址将不同。

加数

如上所示,只有Elf32_Rela条目包含一个明确的加数。类型的条目`Elf32_Rel在要修改的位置存储隐含的加数。根据处理器架构的不同,一种形式或另一种形式可能是必要的或更方便的。因此,针对特定机器的实现可以根据上下文独占地使用一种形式或者以任一种形式使用。

基地址

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

所以它归结为下:

  • 加数和从Elf32_RelElf32_Rela结构算出
  • 基地址和计算从p_vaddr。具体的计算取决于架构。

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