C程序中.bss段的模糊行为

时间:2016-11-18 14:01:59

标签: c global-variables size objdump object-files

我在下面编写了简单的C程序(test.c): -

#include<stdio.h>
int main()
{
   return 0;
}

并执行以下内容以了解.bss段中的大小更改。

gcc test.c -o test
size test

输出结果如下: -

   text    data     bss     dec     hex filename
   1115     552       8    1675     68b test

我没有在全局或静态范围内声明任何内容。所以请解释为什么bss段大小为8个字节。

我做了以下更改: -

#include<stdio.h>
int x;    //declared global variable
int main()
{
   return 0;
}

但令我惊讶的是,输出与之前相同: -

   text    data     bss     dec     hex filename
   1115     552       8    1675     68b test

请解释一下。 然后我初始化了全局: -

#include<stdio.h>
int x=67;    //initialized global variable
int main()
{
   return 0;
}

数据段大小按预期增加,但我并不认为bss段的大小会减少到4(相反,当没有声明任何内容时为8)。请解释。

text       data     bss     dec     hex filename
1115        556       4    1675     68b test

我也尝试了命令objdump和nm,但是它们也显示变量x占用.bss(在第二种情况下)。但是,size命令不会显示bss大小的变化。

我遵循以下程序: http://codingfox.com/10-7-memory-segments-code-data-bss/  输出完全按预期进行。

2 个答案:

答案 0 :(得分:6)

编译简单的main程序时,您也链接启动代码。 此代码除其他外,还负责init bss。

该代码是“使用”你在.bss部分中看到的8个字节的代码。

您可以使用-nostartfiles gcc选项删除该代码:

  

<强> -nostartfiles

     

链接时请勿使用标准系统启动文件。标准系统库通常使用,除非使用-nostdlib或-nodefaultlibs

要进行测试,请使用以下代码

#include<stdio.h>

int _start()
{
   return 0;
}

并使用

进行编译
gcc -nostartfiles test.c

你会看到.bss设置为0

   text    data     bss     dec     hex filename
    206     224       0     430     1ae test

答案 1 :(得分:1)

由于您未使用变量x,因此前两个代码段完全相同。

试试这个

#include<stdio.h>
volatile int x;
int main()
{
   x = 1;
   return 0;
}

您应该会看到.bss尺寸的变化。

请注意,那些4/8字节是启动代码中的内容。如果没有深入研究所提到的启动代码的所有细节,它是什么以及它的大小变化是不可能的。