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

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

#include 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 int x; //declared global variable int main() { return 0; } 

但令我惊讶的是,输出与以前相同: –

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

请解释。 然后我初始化了全局: –

 #include 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/其中输出完全符合预期。

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

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

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

-nostartfiles

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

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

 #include int _start() { return 0; } 

并用它编译

 gcc -nostartfiles test.c 

你会看到.bss设置为0

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

您的前两个片段是相同的,因为您没有使用变量x

试试这个

 #include volatile int x; int main() { x = 1; return 0; } 

你应该看到.bss大小的变化。

请注意,那些4/8字节是启动代码中的内容。 如果不深入研究所提到的启动代码的所有细节,就无法分辨它的大小和原因。