昨天看《程序员的自我修养——链接,装载与库》发现不是很理解为什么要用common块,然后仔细看了一番,有了自己的理解。
common块:用来存放弱符号,而全局未初始化变量是弱符号,但是难道不是应该存放在.bss段吗,为什么要有common块呢?
原因:首先链接器是无法识别符号的类型的,它支持存在多个相同的弱符号存在,但是如果存在多个相同的弱符号,没有强符号存在的情况下,会默认最大的弱符号的内存大小是我们要分配的内存。但是在多文件链接的时候,可能在其他文件中会存在相同的弱符号但是类型可能会不同,所以当一个文件中被编译时,他的弱符号大小无法被确定,因为其他文件中也会存在弱符号,但是当最后链接到一起时,他的大小可以被确认,最终还是被放在了.bss段。
这里说一下c++的全局初始化变量,有的编译器会默认给他赋值为0,所以有了初始化就是强符号,那么存在多个强符号,编译时就会出问题。