强符号 弱符号

本文的主要内容包括符号指的是什么为什么要存在强符号,弱符号,什么是强引用、弱引用,它们的作用是什么?最后介绍链接器的COMMON块机制(Common Block)。

一、符号----链接的接口:

在链接过程这种,目标文件之间相互拼合实际上是目标文件之间对地址的引用,即对函数和变量地址的引用。在链接中,我们将函数和变量统称为符号(Symbol),函数名或变量名就是符号名(Symbol Name)。符号值(Symbol Value)就是变量或者函数的地址。

强符号 强引用 弱符号 弱引用

对C++来说,编译器默认函数和初始化了的全局变量称为强符号,未初始化的全局变量为弱符号。

连接器处理符号准则

1. 不允许强符号被多次定义,否则报错

2.  如果一个符号在某个目标文件中为强符号,其他目标文件为弱符号,那么选择强符号

3. 如果一个符号在所有目标文件中都为弱符号,那么选择其中占用空间最大的

二、强引用:连接器对外部目标文件的符号引用在目标文件链接成可执行文件时,若未找到该符号定义,链接器报未定义错误,成为强引用

弱引用:与强引用想对,弱符号未定义,连接器对于该引用不报错

引入它们的作用

1. 库中定义的弱符号可以被用户定义的强符号覆盖,从而使程序可以使用自定义版本的库函数

2. 使得程序更容易加载和组合(程序可以对某些扩展功能模块的引用定义为弱引用,当我们将扩展模块与程序链接在一起时,功能模块就可以正常使用,如果我们去掉某些功能模块,那么程序也可以正常链接,比如Linux编译时的-lpthread选项,可选择支持多线程or单线程)

三、COMMON块

前面提到了强符号和弱符号,符号的定义是允许出现在多个目标文件的,那么连接器是如何处理一下情况的呢

COMMOM块引入的原因:编译器和连接器允许不同类型的弱符号存在,但是连接器不支持符号类型,即连接器无法判断各个符号的类型是否一致!以下是COMMON块处理机制

1. 两个或两个以上强符号类型不一致

链接器:非法定义,报错

2. 一个强符号,其他为弱符号

连接器:输出结果中符号所占的空间与强符号所占的强符号相同,如果弱符号的空间大小大于强符号,那么连接器给出警告

3. 两个或者两个以上弱符号的类型不同

连接器:以输入文件中最大的那个符号为准!



你可能感兴趣的:(C++)