关于BSS段的一些问题,求各位帮忙解惑

zyt5166096 2016-12-06 01:55:52
测试代码如下:
#include <stdio.h>
int i;
int main(void)
{
return 0;
}

BSS段中存的是未初始化的全局变量,那么以上代码的BSS段大小应该是4,但是输入size test.o结果如下:
ting@TING-PC:~/test$ size test.o
text data bss dec hex filename
67 0 0 67 43 test.o

如果将代码改为:
#include <stdio.h>
int i = 0;
int main(void)
{
return 0;
}

BSS段大小就为4了:
ting@TING-PC:~/test$ gcc -c test.c
ting@TING-PC:~/test$ size test.o
text data bss dec hex filename
67 0 4 71 47 test.o

按理来说未初始化,或者被初始化为0的全局变量都应该保存在BSS段中阿,为什么会这样,求大家帮忙解答。
...全文
336 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2016-12-06
  • 打赏
  • 举报
回复
这么考虑是减小可执行文件的大小
pengzhixi 2016-12-06
  • 打赏
  • 举报
回复
bss段里面只是一些占位符并不分配真正的存储空间。
  • 打赏
  • 举报
回复
引用 5 楼 zyt5166096 的回复:
[quote=引用 2 楼 q3733353520 的回复:] 把i=0改成i=10,再看看。 可能编译器默认把0值当作未初始化。 有些编译器把全局的未初始化变量存放在目标文件.bss段,有些则不存放,只是预留一个未定义的全局变量符号,等到最终链接成可执行文件的时候再在.bss段分配空间。
谢谢你!! 好像是初始化为0的全局变量在生成obj文件后会保存在.bss段(当然并不占用obj的空间,只是一个大小的标识),没有初始化的全局变量则是先保存在common段,等到将obj链接的时候才放入bss段,应该是这个原因吧,但是我发现如果编译cpp文件的话没有初始化的全局变量也会存在obj的bss段[/quote] 编译器不一样,而且要确定不能是链接后的文件
zyt5166096 2016-12-06
  • 打赏
  • 举报
回复
引用 2 楼 q3733353520 的回复:
把i=0改成i=10,再看看。 可能编译器默认把0值当作未初始化。 有些编译器把全局的未初始化变量存放在目标文件.bss段,有些则不存放,只是预留一个未定义的全局变量符号,等到最终链接成可执行文件的时候再在.bss段分配空间。
谢谢你!! 好像是初始化为0的全局变量在生成obj文件后会保存在.bss段(当然并不占用obj的空间,只是一个大小的标识),没有初始化的全局变量则是先保存在common段,等到将obj链接的时候才放入bss段,应该是这个原因吧,但是我发现如果编译cpp文件的话没有初始化的全局变量也会存在obj的bss段
小灸舞 版主 2016-12-06
  • 打赏
  • 举报
回复
Unix FAQ section 1.3(http://www.faqs.org/faqs/unix-faq/faq/part1/section-3.html)里面有Unix和C语言之父Dennis Rithcie对BSS这个词由来的解释。
一般C语言的编译后执行语句都编译成机器代码,保存在.text段;已初始化的全局变量和局部静态变量都保存在. data段;未初始化的全局变量和局部静态变量一般放在一个叫.“bss”的段里。我们知道未初始化的全局变量和局部静态变量默认值都为0,本来它们也可以被放在.data段的,但是因为它们都是0,所以为它们在.data段分配空间并且存放数据0是没有必要的。程序运行的时候它们的确是要占内存空间的,并且可执行文件必须记录所有未初始化的全局变量和局部静态变量的大小总和,记为.bss段。所以.bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以它在文件中也不占据空间
赵4老师 2016-12-06
  • 打赏
  • 举报
回复
为什么不参考gcc源代码相关片断呢?
  • 打赏
  • 举报
回复
把i=0改成i=10,再看看。 可能编译器默认把0值当作未初始化。 有些编译器把全局的未初始化变量存放在目标文件.bss段,有些则不存放,只是预留一个未定义的全局变量符号,等到最终链接成可执行文件的时候再在.bss段分配空间。
zyt5166096 2016-12-06
  • 打赏
  • 举报
回复
求各位帮忙解答一下啊!!谢谢

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧