ZHCUAV7Z september 1995 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
汇编器在处理每一个段时均假设它始于地址 0。当然,在存储器中不可能所有段都始于地址 0,因此链接器必须将段重定位。重定位与符号相关,而不是与段相关。
链接器将段重定位的方式是:
链接器使用重定位条目调整对符号值的引用。汇编器在可重定位的符号被引用时会创建一个重定位条目。然后链接器会使用这些条目在符号重新定位后修补引用。以下示例包含 ARM 器件的代码片断,汇编器会针对它们生成重定位条目。
1 *********************************************
2 ** 生成重定位条目 **
3 *********************************************
4 .ref X
5 .def Y
6 00000000 .text
7 00000000 E0921003 ADDS R1, R2, R3
8 00000004 0A000001 BEQ Y
9 00000008 E1C410BE STRH R1, [R4, #14]
10 0000000c EAFFFFFB! B X ; generates a relocation entry
11 00000010 E0821003 Y: ADD R1, R2, R3
在以上示例中,符号 X 和 Y 均可重定位。Y 在本模块的 .text 段中定义;X 在另一模块中定义。汇编代码时,X 的值为 0(汇编器假定所有未定义的外部符号的值均为 0),Y 的值为 16(相对于 .text 段中的地址 0)。汇编器生成两个重定位条目:一个用于 X,一个用于 Y。对 X 的引用是外部引用(由列表中的 ! 字符表示)。 对 Y 的引用是对内部定义的可重定位符号的引用(由列表中的 ' 字符表示)。
链接代码后,假设将 X 重定位到地址 0x10014。再假设将 .text 段重定位为从地址 0x10000 开始;Y 目前的重定位值为 0x10010。链接器使用引用 X 的重定位条目来修补目标代码中的分支指令:
|
becomes |
|