ZHCU947E June 2015 – January 2023
有时您可能希望将代码加载到存储器的一个区域,并在运行前将它移至另一个区域。例如,基于外部存储器的系统中可能有对性能至关重要的代码。代码必须加载至外部存储器,但在内部存储器中能够以更快的速度运行。由于内部存储器空间有限,可以在不同时间交换不同的速度关键型功能。
链接器提供了处理此任务的一种方式。使用 SECTIONS 指令,您可以选择使链接器分配一个段两次:首先设置其加载地址,接着设置其运行地址。加载地址使用 load 关键字,运行地址使用 run 关键字。请参阅GUID-BF516D04-80F5-4057-BADD-5A739DF53956.html#GUID-BF516D04-80F5-4057-BADD-5A739DF53956,以进一步了解加载地址和运行地址。如果段在链接时被分配了两个地址,该段中定义的所有标签会重新定位为引用运行时地址,以便在代码运行时正确引用该段(例如,分支)。
如果您只为某个段提供了一个分配(加载或运行),该段只会分配一次,并会在相同的地址加载和运行。如果您提供了两个分配,该段实际上会被视作两个单独的段来进行分配。如果加载段未压缩,那么这两个段大小相同。
未初始化的段(例如 .bss)不会被加载,因此唯一重要的地址是运行地址。链接器只分配一次未初始化的段;如果您同时指定运行地址和加载地址,链接器会向您发出警告并忽略加载地址。
有关运行时重定位的完整说明,请参阅GUID-F5E666B1-566B-4579-A080-AB90BE70E3C3.html#GUID-F5E666B1-566B-4579-A080-AB90BE70E3C3。