如何读取目标文件的重定位记录

时间:2014-10-05 18:39:34

标签: c object linker relocation

我正在尝试理解C工具链的链接阶段。我编写了一个示例程序并剖析了生成的目标文件。虽然这有助于我更好地理解所涉及的过程,但有些事情对我来说仍然不清楚。

以下是:

第1部分:处理初始化变量。

是否正确,这些重定位表条目......

RELOCATION RECORDS FOR [.text]:
OFFSET   TYPE              VALUE
0000002b dir32             .data
00000035 dir32             .data
0000003f dir32             .data

...基本上告诉链接器,存储在来自2b的偏移353f.text的地址不是绝对地址,而是相对地址( = {偏移}与.data有关?据我所知,这使链接器能够

  • 将这些相对地址转换为绝对地址,以创建不可重定位目标文件,
  • 或者只是相应地调整它们,以防目标文件与其他目标文件链接。

第2部分:处理未初始化的变量。

我不明白为什么未初始化的变量与初始化变量的处理方式不同。为什么寄存器地址存储在操作码中,

  • 等于所有未初始化的变量(0x0,0x0和0x0),而
  • 对于所有初始化变量(0x0,0x4和0x8)不同?

他们的重定位表条目的值字段对我来说完全不清楚。我本来期望在那里引用.bss部分。

RELOCATION RECORDS FOR [.text]:
OFFSET   TYPE              VALUE
0000000d dir32             _var1_zeroed-0x00000004
00000017 dir32             _var2_zeroed-0x00000004
00000021 dir32             _var3_zeroed-0x00000004

1 个答案:

答案 0 :(得分:2)

  

...基本上告诉链接器,地址存储在offset ...

不,链接器不再涉及此问题。重定位表告诉 loader ,操作系统负责将可执行映像加载到内存中的地址。

链接器基于所有内容都是理想的假设并且可以在预期地址加载图像来构建可执行映像。如果是这样,那么一切都很糟糕,没有什么需要做的。但是,如果存在冲突,虚拟地址空间已被其他东西使用,则需要将图像重新定位到不同的地址。

这需要修补地址,需要添加理想和实际加载地址之间的偏移。因此,如果.data部分以另一个地址结束,则必须更改地址.text + 0x2b,.text + 0x35等。对于未初始化的变量没有什么不同,链接器已经为它们选择了一个地址,但是当_var1_zeroed-0x00000004在另一个地址结束时,然后需要更改.text + 0x0d,.text + 0x17,等等。