目标文件包含一个符号表,存储着目标文件中相关符号 的信息。链接器在执行重定位时会使用此表。请参阅节 2.7。
目标文件符号是一个指定的 32 位整数值,通常表示一个地址。符号可以表示诸如函数、变量、段的起始地址,或绝对整数(如栈大小)之类的东西。
在汇编中定义符号时,需添加标签或 .set .equ .bss、.usect 等指令。
符号具有绑定 属性,类似于 C 语言的链接 概念。ELF 文件可能包含绑定为局部符号、全局符号 和 弱符号 的符号。
- 全局符号在整个程序中可见。链接器不允许特定符号具有超过一个全局定义;如果全局符号定义超出一次,会生成多重定义错误。(汇编器可以为局部符号提供类似的“多重定义”错误。)从目标文件引用全局符号,会引用该符号唯一允许的全局定义。汇编代码必须添加 .def、.ref 或 .global 指令,显式定义全局符号。(请参阅节 2.6.1。)
- 局部符号只在一个目标文件中可见;每个使用某符号的目标文件均需要自己的局部定义。引用一个目标文件中的局部符号与另一个目标文件中的同名局部符号完全无关。默认情况下符号是局部符号。(请参阅节 2.6.2。)
- 弱符号是在当前模块中使用但未定义的符号。它们可能在另一模块中定义,也可能未在另一模块中定义。弱符号会被另一个目标文件中同名的强(非弱)全局符号定义覆盖。如果具有可用的强定义,弱符号会被强符号替代。如果没有可用定义(即弱符号未解析),则不会生成错误,但弱变量的地址将为 null (0)。因此,访问弱变量的应用代码在尝试访问该变量之前必须确保其地址非零。(请参阅节 2.6.3。)
绝对符号 是具有数字值的符号。它们可能是常量。对于链接器而言,这样的符号是无符号的,但整数会根据其使用方式被视为有符号或无符号类型。若处理为无符号类型,则绝对整数合法值的范围是 0 到 2^32-1,若处理为有符号类型,则为 -2^31 到 2^31-1。
有关汇编器符号 的信息,请参阅节 4.8。