为什么当代码中没有未初始化的全局变量或静态变量时,bss段包含初始的4个字节

bal*_*raj 1 c memory-management

我有这个简单的代码.

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

在可执行文件上运行size命令显示以下输出

   text    data     bss     dec     hex filename
   1053     276       4    1333     535 a.out
Run Code Online (Sandbox Code Playgroud)

我的问题是,即使我没有任何未初始化的全局变量或静态变量,为什么bss有4个字节?

Rob*_*obᵩ 8

您将代码链接到标准C库.具体来说,您将链接到main()启动前运行的代码和main()返回后再运行的代码.

该代码具有数据和bss要求.

如果您想避免这些要求,可以尝试在没有标准库的情况下进行链接:

$ gcc  -nostartfiles -nostdlib -nodefaultlibs x.c
$ size a.out
  text     data     bss     dec     hex filename
   118        0       0     118      76 a.out
Run Code Online (Sandbox Code Playgroud)

当然,那么你需要对你的程序进行其他(重要的!)更改:

$ cat x.c 
void _start() {
  __asm("mov $1, %eax; mov %eax,%ebx; int $0x80");
}
Run Code Online (Sandbox Code Playgroud)

参考文献: