【读书笔记】程序员的自我修养总结(五)
声明:引用请注明出处http://blog.youkuaiyun.com/lg1259156776/
说明:这是程序员的自我修养一书的读书总结,随着阅读的推进,逐步增加内容。
COMMON块
前面提到过强弱符号机制允许同一个符号的定义存在于多个文件中,编译器知道变量数据类型,而链接器则不知道数据类型,即变量类型对链接器是透明的,只知道一个符号的名字,并不知道类型是否一致。当定义多个类型不一致的符号时,链接器该如何处理呢?
一种情况是两个强符号,当然直接链接器报错,不允许强符号多重定义;
二种情况是一个强符号,其余是弱符号。肯定直接只选择强符号,而不管数据类型的空间那个大;
三种情况是多个弱符号,选择数据类型占据内存空间最大的那个定义。
当编译器将一个编译单元编译成目标文件时,如果编译单元包含了弱符号,那么弱符号最终占据空间大小是未知的,因为它不知道其他编译单元中该弱符号占据的空间大小,所以编译器无法为该弱符号在BSS段分配空间,因为所需空间大小未知。但链接器在链接过程中可以确定弱符号的大小,因为链接器读取所有输入目标文件以后,任何一个弱符号的最终大小都可以确定,可以在最终的输出文件的bss段为其分配空间。总体上看,未初始化的全局变量最终还是被放到BSS段的。
这里再说明一下:
未初始化全局变量在目标文件中是没有分配空间的,因为上面所讲原因,而初始化的全局变量是强符号,在目标文件中是已经分配地址了