我开发了一个简单的C程序,如下所示。
int main()
{
return 0;
}
我使用gcc v5.2.1编译了程序。当我在下面的可执行文件上运行Unix命令'size'时显示它的大小..
text = 1131,data = 552,bss = 8
根据我的理解,数据部分保存初始化的全局数据,BSS保存未初始化的全局数据。虽然没有全局变量,为什么“数据”和“BSS”部分显示非零值?
答案 0 :(得分:2)
简而言之:因为您的最终程序具有更多代码,而不仅仅是您编写的部分。它必须包含一些运行时,例如在调用main()
之前完成所需的所有设置(如填充argv
,将.bss
中的数据初始化为零,等等)以及退出后清理。在这段代码中完成的工作完全取决于您的实现。
答案 1 :(得分:0)
回答你的问题:启动代码有自己的数据。该示例中显示了该数据。
如何调用段是实现定义的,但大多数启动代码&链接器脚本使用这个最受欢迎的脚本。
.text - 您的程序代码
.rodata - 仅限RO数据 - 例如字符串文字。许多实现将const
(const 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。