在可执行文件(.exe)和目标文件(.o)中,有一个.bss段。
我们常说“.bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以它在文件中也不占据空间”
这句话没有表述完整
首先,.bss段中还包括了初始化为0的全局变量和局部静态变量
其次,说.bss段没有内容是指它在可执行文件中的.bss段中是没有存放变量名和数值,因此也不占据磁盘空间,但这不是说没有保存关于“未初始化或初始化为0的全局变量和静态变量的相关信息”。在可执行文件中的.bss段中,我们确实没有保存变量的任何信息,因为这些变量的值尚不确定,不保存它们反而能节省磁盘空间;但是,我们其实保存了一个地址范围(一个起始地址和一个结束地址)在FileHeader处,这个地址范围是这些变量所需的内存空间的大小。
当程序运行(被加载到内存)时
1.操作系统根据可执行文件中的地址范围划分一块地址空间
2.链接器根据符号表知道变量的符号和属性,然后根据变量的符号去到目标文件中的bbs段,得到了这个变量的大小(变量的大小是由编译器在生成目标文件时计算出来的,然后写入bss段中)
3.链接器通过符号表和目标文件的bbs段,知道了变量的大小和符号,然后为这些变量分配合适的位置,并把它们的地址和偏移量写入重定位表,由此可以确定每个变量在可执行文件中的位置,并把这些信息写入可执行文件的头部。
4.当操作系统加载可执行文件时,它会根据这些信息来为每个变量分配内存空间,并把它们的值初始化为零或者目标文件中给定的值。
注:bss中的占位符的含义是未初始化的全局变量或静态变量所需的空间大小,其实就是我们在可执行文件中存储的地址范围