在编程的过程中经常会遇到一种符号重定义的情况。比如在多个目标文件中含有名字相同的全局变量的定义,那么在链接时会出现符号重定义的错误,我们将这种符号称为强符号。
相对来说我们也可以定义一种叫做弱符号的概念,C/C++编译器来说默认函数和初始化了的全局变量为强符号,而未初始化的全局变量为弱符号。针对强弱符号的定义,链接器会按照下列的规则进行处理强弱符号的选择:
1、 不允许强符号多次定义,如果有则直接报错。
2、 如果一个符号在某个文件时强符号,在其他文件时弱符号那么选择强符号。
3、 如果在多个文件中的同名符号都是弱符号,那么选择占用内存最大的那个符号。
4、 在静态链接的过程中,弱符号是不放在.BSS段的,是先放在.comment段。在链接时决定具体使用的符号。