事实上,现在的编译器和链接器都支持一种叫COMMON块的机制,这种机制最早来源于Fortan,早起的Fortan没有动态分配空间的机制,程序员必须事先声明它所需要的临时使用空间的大小。Fortan把这种空间叫COMMON块,当不同的目标文件需要的COMMON块空间大小不一致时,以最大的那块为准。 现代的链接机制在处理弱符号的时候,采用的...
避免这种错误的一个方法是,给gcc加上-fno-common选项。 COMMON块 由于弱符号机制允许同一个符号的定义存在于多个文件中,所以可能会导致的一个问题是:如果一个弱符号定义在多个目标文件中,而它们的类型又不同,怎么办?目前的链接器本身并不支持符号的类型,即变量类型对于链接器来说是透明的,它只知道一个符号的名字...
GCC的“-fno-common”也允许我们把所有未初始化的全局变量不以COMMON块的形式处理,或者使用“__attribute__”拓展. 一旦一个未初始化的全局变量不是以COMMON块的形式存在,那么它就相当于一个强符号,如果其他目标文件中还有同一个变量的强符号定义,链接时就会发生符号重复定义错误。