ZHCU947E June 2015 – January 2023
有条件地将段保留在目标模块输出内
.retain["section name"]
.retainrefs["section name"]
.retain 指令用于指示当前段或指定的段不符合通过条件链接进行移除的条件。用户也可以使用 --retain 链接器选项为指定的段覆盖条件链接。用户也可以使用 --unused_section_elimination=off 链接器选项完全禁用条件链接。
.retainrefs 指令指示引用当前段或指定段的任何段均不符合通过条件链接进行移除的条件。例如,应用程序可能使用 .intvecs 段来设置中断矢量。默认情况下,.intvecs 段符合在条件链接期间进行移除的条件。用户可以通过对 .intvecs 段应用 .retain 和 .retainrefs 指令,强制保留 .intvecs 段以及任何引用它的段。
段名用于标识段。如果使用该指令时未搭配段名,则它适用于当前已初始化的段。如果指令应用于未初始化的段,则需要段名。段名必须用双引号引起来。段名可包含 段名:子段名 形式的子段名。
链接器假定默认情况下所有段都不符合通过条件链接进行移除的条件。(不过,链接器会自动保留 .reset 段。)如果用户希望将某段保留在链接中(即使链接中的任何其他段均未引用该段),.retain 指令对于覆盖段的这种默认条件链接行为非常有用。例如,用户可以对以汇编语言编写但在应用程序中任何正常入口点均未引用的中断函数应用 .retain 指令。
此示例中断函数应用了 .retain 指令。
.sect ".text:interrupts:retain"
.retain
.global _int_func1
_int_func1:
STW .D2 FP,*SP++(-88) ; [B_D] |31|
STW .D2 B3,*SP(80) ; [B_D] |31|
STW .D2 A4,*SP(24) ; [B_D] |31|
STW .D2 B2,*SP(84) ; [B_D] |31|
STW .D2 B9,*SP(76) ; [B_D] |31|
STW .D2 B8,*SP(72) ; [B_D] |31|
STW .D2 B7,*SP(68) ; [B_D] |31|
STW .D2 B6,*SP(64) ; [B_D] |31|
STW .D2 B5,*SP(60) ; [B_D] |31|
STW .D2 B4,*SP(56) ; [B_D] |31|
STW .D2 B1,*SP(52) ; [B_D] |31|
STW .D2 B0,*SP(48) ; [B_D] |31|
STW .D2 A7,*SP(36) ; [B_D] |31|
STW .D2 A6,*SP(32) ; [B_D] |31|
STW .D2 A5,*SP(28) ; [B_D] |31|
CALL .S1 _foo ; [A_S] |32|
|| STW .D2 A8,*SP(40) ; [B_D] |31|
...
STW .D2 B4,*+DP(_a_i) ; [B_D] |33|
RET .S2 IRP ; [B_Sb] |34|
|| LDW .D2 *SP(56),B4 ; [B_D] |34|
LDW .D2 *++SP(88),FP ; [B_D] |34|
NOP 4 ; [A_L]