默认情况下BSS和数据段有哪些数据?

时间:2017-08-27 11:16:14

标签: c linux unix

我开发了一个简单的C程序,如下所示。

int main()
{
    return 0;
}

我使用gcc v5.2.1编译了程序。当我在下面的可执行文件上运行Unix命令'size'时显示它的大小..

  

text = 1131,data = 552,bss = 8

根据我的理解,数据部分保存初始化的全局数据,BSS保存未初始化的全局数据。虽然没有全局变量,为什么“数据”和“BSS”部分显示非零值?

2 个答案:

答案 0 :(得分:2)

简而言之:因为您的最终程序具有更多代码,而不仅仅是您编写的部分。它必须包含一些运行时,例如在调用main()之前完成所需的所有设置(如填充argv,将.bss中的数据初始化为零,等等)以及退出后清理。在这段代码中完成的工作完全取决于您的实现。

答案 1 :(得分:0)

回答你的问题:启动代码有自己的数据。该示例中显示了该数据。

如何调用段是实现定义的,但大多数启动代码&链接器脚本使用这个最受欢迎的脚本。

.text - 您的程序代码

.rodata - 仅限RO数据 - 例如字符串文字。许多实现将constconst int x[2] = {1,2};)的对象放在那里

.bss - 使用静态存储的未初始化数据(即全局)

  

在C中,没有显式初始值设定项的静态分配对象是   初始化为零(对于算术类型)或空指针(对于   指针类型)。 C的实现通常表示零值   和使用仅由...组成的位模式的空指针值   零值位(尽管C标准不要求这样做)。   因此,BSS段通常包括所有未初始化的对象   (在文件范围内声明的变量和常量)(即外部   任何函数)以及未初始化的静态局部变量(本地   用static关键字声明的变量);静态局部常量   必须在声明时初始化,因为他们没有   单独声明,因此通常不在BSS部分,   虽然它们可能被隐式或显式初始化为零。一个   实现也可以分配静态分配的变量和   用仅由零值组成的值初始化的常量   比特到BSS部分。

.data -

  

.data段包含任何具有a的全局变量或静态变量   预定义值,可以修改。这是任何变量   未定义在函数内(因此可以从任何地方访问)   或者在函数中定义,但是被定义为静态,因此它们保留   他们在后续电话中的地址。

示例:

 static char x[] = "Hello world";

String literal“”Hello world“存储在.rodata段中,并在启动过程中复制到位于.data段中的char表x。