符号及符号表
符号的定义和引用
链接符号的类型
链接符号类型举例
目标文件中的符号表
符号表信息举例
符号解析(Symbol Resolution)
全局符号的强、弱
链接器对符号的解析规则
多重定义符号的处理规则 Rule 1: 强符号不能多次定义 – 强符号只能被定义一次,否则链接错误 Rule 2: 若一个符号被定义为一次强符号和多次弱符号,则 按强定义为准 – 对弱符号的引用被解析为其强定义符号 Rule 3: 若有多个弱符号定义,则任选其中一个 – 使用命令 gcc –fno-common链接时,会告诉链接器在 遇到多个弱定义的全局符号时输出一条警告信息。 符号解析时只能有一个确定的定义(即每个符号仅占一处存储空间)
多重定义符号的解析举例
多重定义全局符号的问题
尽量避免使用全局变量
• 一定需要用的话,就按以下规则使用
– 尽量使用本地变量(static)
– 全局变量要赋初值
– 外部全局变量要使用extern
多重定义全局变量会造成一些意想不到的错误,而且是默默发生的,编译系统不会警告,并会在程序执行很久后才能表现出来
,且远离错误引发处。特别是在一个具有几百个模块的大型软件中,这类错误很难修正。
大部分程序员并不了解链接器如何工作,因而养成良好的编程习惯是非常重要的。