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

Mul*_*ync 5 c linker object relocation

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

这是:

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

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

RELOCATION RECORDS FOR [.text]:
OFFSET   TYPE              VALUE
0000002b dir32             .data
00000035 dir32             .data
0000003f dir32             .data
Run Code Online (Sandbox Code Playgroud)

...基本上是告诉链接器,使存储在地址偏移2b,35并且3f.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
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 3

...基本上是告诉链接器,地址存储在偏移量...

不,链接器不再参与其中。重定位表告诉loader,即操作系统中负责将可执行映像加载到内存中的部分。

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

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