我正在尝试理解C工具链中的链接阶段。我编写了一个示例程序并分析了生成的目标文件。虽然这帮助我更好地理解了涉及的过程,但还有一些事情对我来说仍然不清楚。
以下是:
以下是:
第1部分:处理已初始化变量。
这些重定位表条目是否正确...
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000002b dir32 .data
00000035 dir32 .data
0000003f dir32 .data
基本上,您告诉链接器,从.text
偏移量2b
、35
和3f
处存储的地址不是绝对地址,而是相对于.data
的偏移量。我理解这样做是为了使链接器能够:
- 将这些相对地址转换为绝对地址以创建不可重定位的目标文件;
- 或者在将目标文件与其他目标文件链接时适当地进行调整。
第二部分:处理未初始化的变量。
我不明白为什么未初始化的变量与初始化的变量处理方式如此不同。为什么寄存器地址存储在操作码中,
- 对于所有未初始化的变量(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