强弱符号规则

当多个目标文件中出现同名全局变量时,链接器根据强弱符号规则来决定如何处理。

强符号:已初始化的全局变量和所有函数定义。如 int x = 5;void func() {}

弱符号:未初始化的全局变量。如 int x;(未赋初值)。

三条核心规则:

  1. 规则1:强符号不能重复定义。如果有多个目标文件定义了同名的强符号,链接器会报 multiple definition 错误。

  2. 规则2:如果一个符号在某个文件中是强符号,在其他文件中是弱符号,则选择强符号。链接器不会报错,但需要留意类型可能不一致。

  3. 规则3:如果所有定义都是弱符号,则任选一个。链接器不会报错,但选择是不确定的。

⚠️ 隐蔽的bug:当同一个弱符号在不同文件中被声明为不同类型时(如一个文件认为是 int,另一个认为是 double),会导致内存越界。使用 -fno-common 编译选项可以将所有未初始化变量视为强符号,从而在编译阶段发现这类问题。

链接到