.bss段存储未初始化的全局变量与未初始化的局部静态变量,这是教科书上的标准内容。但令人奇怪的一点,在ELF文件格式(Linux的目标文件格式)中,.bss段并没有真正的占用目标文件的空间。
如图,这是一个ELF可执行文件的段结构:

可以看到,虽然.bss段size为8字节,但其file offset与相邻段完全相同。而且还可以看到,.bss段是没有CONTENTS属性的,这就表示它实际上在此文件中不存在内容。
为什么会这样呢?
这是为了节省空间,因为未初始化的全局变量和局部静态变量默认值都为0,没有必要占用多余空间(为肯定是0的变量占用.data段的空间是没有必要的),.bss段只是为它们预留了位置,并没有内容。
注意:但在程序运行时,它们还是要占用内存空间的。
这就导致一个很有趣的现象,含有未初始化的全局大数组与含有已初始化的全局大数组的相同代码,编译出的目标文件大小相差很大。
至于.bss的大小到底存放在哪里,已经.bss段在什么时候生成,且听下回分解。