ZHCU875Z August 2001 – October 2023 SM320F28335-EP
弱符号是可能定义,也可能不定义的符号。
弱符号仅在 EABI 模式下受支持。
对于定义了“弱”绑定的符号与定义了全局绑定的符号,链接器的处理方式不同。如果某弱符号需要解析某未以其他方式解析的引用,链接器不会在目标文件的符号表中包含该弱符号(就像全局符号那样),而只会在“最终”链接的输出中包含该弱符号。
这样可使链接器省略解析引用时不需要的符号,最大限度地减少输出文件的符号表中包含的符号数量。减小输出文件符号表的大小,可减少链接所需的时间,特别是在有大量预先加载的符号要予以链接的情况下。
用户可以使用 .weak 汇编指令或链接器命令文件中的弱运算符来定义弱符号。
.weak ext_addr_sym
ext_addr_sym .set 0x12345678
汇编定义了弱符号的源文件,并在链接中包含生成的目标文件。此示例中的“ext_addr_sym”在最终链接中作为弱符号提供。如果应用中的其他位置未引用该符号,它会成为候选的删除对象。请参阅 .weak 指令。
weak(ext_addr_sym) = 0x12345678;
如果链接器命令文件执行最终链接,“ext_addr_sym”会作为弱符号提供给链接器;如果未引用该符号,它将不会被包含在生成的输出文件中。请参阅节 8.6.5。
如果同一符号有多个定义,链接器会根据特定规则确定优先使用哪个定义。一些定义可能有弱绑定,另一些定义可能有强绑定。“强”在此上下文中意为该符号并未 通过上述任一种方法进行弱绑定。一些定义可能来自输入目标文件(即使用汇编指令),另一些可能来自链接器命令文件中的赋值语句。
链接器根据以下指导原则确定将引用解析为符号时使用哪个定义: