符号及符号表

符号的定义和引用

链接符号的类型

链接符号类型举例

目标文件中的符号表

 

符号表信息举例

符号解析(Symbol Resolution)

全局符号的强、弱

 

链接器对符号的解析规则

多重定义符号的处理规则
Rule 1: 强符号不能多次定义
    – 强符号只能被定义一次,否则链接错误
Rule 2: 若一个符号被定义为一次强符号和多次弱符号,则
按强定义为准
    – 对弱符号的引用被解析为其强定义符号
Rule 3: 若有多个弱符号定义,则任选其中一个
    – 使用命令 gcc –fno-common链接时,会告诉链接器在
    遇到多个弱定义的全局符号时输出一条警告信息。
    符号解析时只能有一个确定的定义(即每个符号仅占一处存储空间)

多重定义符号的解析举例

多重定义全局符号的问题

尽量避免使用全局变量
• 一定需要用的话,就按以下规则使用
    – 尽量使用本地变量(static)
    – 全局变量要赋初值
    – 外部全局变量要使用extern
多重定义全局变量会造成一些意想不到的错误,而且是默默发生的,编译系统不会警告,并会在程序执行很久后才能表现出来
,且远离错误引发处。特别是在一个具有几百个模块的大型软件中,这类错误很难修正。
大部分程序员并不了解链接器如何工作,因而养成良好的编程习惯是非常重要的。

猜你喜欢

转载自www.cnblogs.com/chenxuming/p/9706161.html