ZHCUAV7Z september 1995 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , C346BA02 , C348A01 , CS241C01-Q1 , CS241C05-Q1 , CS246C01-Q1 , CS348C02-Q1 , OMAP-L132 , OMAP-L137 , OMAP-L138 , S470AV336LYSQRB , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
全局符号是在当前模块中访问但在另一模块中定义的符号(外部符号),或是在当前模块中定义并在另一模块中访问的符号。此类符号在各目标模块中均可见。您必须使用 .def、.ref 或 .global 指令将符号识别为外部符号:
.def | 该符号在当前文件中定义,并可在另一文件中使用。 |
.ref | 该符号在当前文件中引用,但在另一文件中定义。 |
.global | 该符号可以是上述任一种。汇编器会根据每个符号的情况选择 .def 或 .ref。 |
以下代码片段说明了 .global 指令的用法。
x: ADD R0, #56h ; Define x
.global x ; acts as .def x
因为 x 是在此模块中定义的,所以汇编器将“.global x”视为“.def x”。现在,其他模块可以引用 x。
B y ; Reference y
.global y ; .ref of y
因为 y 不是在此模块中定义的,所以汇编器将“.global y”视为“.ref y”。必须在另一模块中定义符号 y。
符号 x 和 y 都是外部符号,并放置在目标文件的符号表中;x 作为已定义的符号,y 作为未定义的符号。当该目标文件与其他目标文件链接时,x 的条目将用于解析其他文件对 x 的引用。y 的条目使链接器在其他文件的符号表中查找 y 的定义。
链接器尝试将所有引用与相应的定义匹配。如果链接器找不到符号的定义,它将打印有关未解析引用的错误消息。此类错误会阻止链接器创建可执行目标模块。
如果多次定义同一个符号,也会出现错误。