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

Mah*_*Roy 7 c size global-variables objdump object-files

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

#include<stdio.h>
int main()
{
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

gcc test.c -o test
size test
Run Code Online (Sandbox Code Playgroud)

输出结果如下: -

   text    data     bss     dec     hex filename
   1115     552       8    1675     68b test
Run Code Online (Sandbox Code Playgroud)

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

我做了以下改变: -

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

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

   text    data     bss     dec     hex filename
   1115     552       8    1675     68b test
Run Code Online (Sandbox Code Playgroud)

请解释.然后我初始化了全球: -

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

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

text       data     bss     dec     hex filename
1115        556       4    1675     68b test
Run Code Online (Sandbox Code Playgroud)

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

我按照以下步骤进行了操作:http: //codingfox.com/10-7-memory-segments-code-data-bss/ 其中输出完全符合预期.

LPs*_*LPs 6

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

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

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

-nostartfiles

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

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

#include<stdio.h>

int _start()
{
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

并用它编译

gcc -nostartfiles test.c
Run Code Online (Sandbox Code Playgroud)

你会看到.bss设置为0

   text    data     bss     dec     hex filename
    206     224       0     430     1ae test
Run Code Online (Sandbox Code Playgroud)