我试图了解 C 工具链的链接阶段。我编写了一个示例程序并剖析了生成的目标文件。虽然这有助于我更好地理解所涉及的过程,但有些事情我仍然不清楚。
以下是:
第 1 部分:初始化变量的处理。
这些重定位表条目是否正确...
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000002b dir32 .data
00000035 dir32 .data
0000003f dir32 .data
...基本上是在告诉链接器,存储在 offset2b
和from的地址不是绝对地址,而是相对于? 据我了解,这使链接器能够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