符号分类

在链接器的视角中,符号分为三类:全局符号、本地符号和外部符号。

全局符号(Global Symbols):由本模块定义、且可以被其他模块引用的符号。非 static 的函数和非 static 的全局变量都属于此类。它们是模块间通信的接口。

本地符号(Local Symbols):由 static 关键字定义,只能在当前源文件中使用的符号。static 函数和 static 全局变量都属于本地符号。使用 static 可以有效防止命名冲突,不同文件中的同名 static 变量互不干扰。

外部符号(External Symbols):本模块引用但定义在其他模块中的符号。使用 extern 关键字声明,链接器需要去其他目标文件中寻找其定义。未找到时会报 undefined reference 错误。

需要注意的是,普通局部变量(函数内自动变量)不构成符号——它们在运行时在栈上分配,链接器完全不需要处理它们的地址。只有具有静态存储期的变量才会出现在符号表中。

链接到