关于bss段,教材中没有说出的点

在可执行文件(.exe)和目标文件(.o)中,有一个.bss段。

我们常说“.bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以它在文件中也不占据空间”

这句话没有表述完整

首先,.bss段中还包括了初始化为0的全局变量和局部静态变量

其次,说.bss段没有内容是指它在可执行文件中的.bss段中是没有存放变量名和数值,因此也不占据磁盘空间,但这不是说没有保存关于“未初始化或初始化为0的全局变量和静态变量的相关信息”。在可执行文件中的.bss段中,我们确实没有保存变量的任何信息,因为这些变量的值尚不确定,不保存它们反而能节省磁盘空间;但是,我们其实保存了一个地址范围(一个起始地址和一个结束地址)在FileHeader处,这个地址范围是这些变量所需的内存空间的大小。

当程序运行(被加载到内存)时
1.操作系统根据可执行文件中的地址范围划分一块地址空间

2.链接器根据符号表知道变量的符号和属性,然后根据变量的符号去到目标文件中的bbs段,得到了这个变量的大小(变量的大小是由编译器在生成目标文件时计算出来的,然后写入bss段中)

3.链接器通过符号表和目标文件的bbs段,知道了变量的大小和符号,然后为这些变量分配合适的位置,并把它们的地址和偏移量写入重定位表,由此可以确定每个变量在可执行文件中的位置,并把这些信息写入可执行文件的头部。

4.当操作系统加载可执行文件时,它会根据这些信息来为每个变量分配内存空间,并把它们的值初始化为零或者目标文件中给定的值。

注:bss中的占位符的含义是未初始化的全局变量或静态变量所需的空间大小,其实就是我们在可执行文件中存储的地址范围

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值