汇编器对每个段汇编时都是从0地址开始,而所有需要重新定位的符号(标号)在段内都是相对于0地址的。事实上,所有段都不可能从存储器中0地址单元开始,因此链接器必须对各个段进行重新定位。
1.地址重定位
重新定位的方法:
将各个段配置到存储器中,使每个段都有一个合适的起始地址;
将符号变量调整到相对于新的段地址的位置;
将引用调整到重新定位后的符号,这些符号
反映了调整后的新符号值。
汇编器在需要引用重新定位的符号处都留了一个重定位入口。链接器在对符号重新定位时,利用这些入口修正对符号的引用值。
2.运行时间重定位
在实际运行中,有时需要将代码装入存储器的一个地方,而在另一个地方运行。
如:一些关键的执行代码必须装在系统的ROM中,但运行时希望在较快的RAM中进行。
利用SECTIONS伪指令选项可让链接器对其定位2次,其方法:
① 使用装入关键字设置装入地址;
② 使用运行关键字设置它的运行地址。
装入地址确定段的原始数据或代码装入的位置,而任何对段的使用(例如其中的标号),则参考它的运行地址。在应用中必须将该段从装入地址复制到运行地址。
如果只为段提供了一次定位(装入或运行),则该段将只定位一次,并且装入和运行地址相同。如果提供了2个地址,则段将被自动定位。