链接器符号处理规则

全局符号分两种

强符号

  • 函数
  • 初始化的全局变量

弱符号

  • 未初始化的全局变量

规则一:不允许多个同名强符号

规则二:一个强符号和多个弱符号同名,选强(有强选强)

  • 对于弱符号的引用被解析为强符号,也就是把那些弱符号当做那个唯一的强符号使用

规则三:有多个弱符号,选择任意一个

  • gcc -fno-common 使多重定义弱符号链接时报错
  • gcc -Werror 警告变为错误,终止链接

两个同名弱符号,由不同的编译器来编译会采用不同的排列规则

对于全局变量

  • 能不用就不用
  • 如果要用
    • 用 static 定义在内部
    • 或者定义的时候初始化
    • 使用 extern 声明为引用的外部全局符号