强弱符号规则
当多个目标文件中出现同名全局变量时,链接器根据强弱符号规则来决定如何处理。
强符号:已初始化的全局变量和所有函数定义。如 int x = 5; 或 void func() {}。
弱符号:未初始化的全局变量。如 int x;(未赋初值)。
三条核心规则:
-
规则1:强符号不能重复定义。如果有多个目标文件定义了同名的强符号,链接器会报
multiple definition错误。 -
规则2:如果一个符号在某个文件中是强符号,在其他文件中是弱符号,则选择强符号。链接器不会报错,但需要留意类型可能不一致。
-
规则3:如果所有定义都是弱符号,则任选一个。链接器不会报错,但选择是不确定的。
⚠️ 隐蔽的bug:当同一个弱符号在不同文件中被声明为不同类型时(如一个文件认为是 int,另一个认为是 double),会导致内存越界。使用 -fno-common 编译选项可以将所有未初始化变量视为强符号,从而在编译阶段发现这类问题。
链接到
- 上一个知识点:7.7 符号分类
- 下一个知识点:7.9 C变量与符号对照