22/8/8 7.6符号解析
7.6符号解析
重整:编译器把每个唯一的方法和参数列表组合编码成一个对链接器来说唯一的名字。(C++,JAVA 重载会使用)
7.6.1 链接器解析多重定义的全局符号
函数和已初始化的全局变量为强符号,未初始化的全局变量为弱符号
链接器会按照以下规则处理强符号和弱符号:
1、 不允许强符号被多次定义
2、 如果一个符号在某个目标文件中是强符号,在其他文件中是弱符号,那么选择强符号。
如果一个符号在所有目标文件中都是弱符号,那么选择其中占用空间最大的一个。(使用多个类型的弱符号会导致程序错误很难被发现)【程序员的自我修养】(深入理解计算机系统说任意一个)//回头实验一下
如果一个变量在一个模块中被定义为强符号,另一个模块中没有初始化为弱符号,但使用了弱符号的类型来使用,会导致一些奇怪的bug,比如可能会覆盖到下一个变量的地址。
可以使用GCC-fno-common的选项来调用链接器,这样遇到多重定义的全局符号,会直接报错。
7.6.2与静态库链接
在Linux系统中,静态库以一种被称为存档的特殊文件格式存放在磁盘中,存档文件是一组链接起来的可重定位文件的集合,有一个头部用来描述每个成员目标文件的大小和位置。
浙公网安备 33010602011771号