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

标签 c memory-management

我有这个简单的代码。

#include<stdio.h>
    int main()
    {
      return 0;
    }

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

   text    data     bss     dec     hex filename
   1053     276       4    1333     535 a.out

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

最佳答案

您将您的代码链接到标准 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

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

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

引用资料:

关于c - 当代码中没有未初始化的全局或静态变量时,为什么 bss 段包含初始 4 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16302802/

相关文章:

delphi - 在 Delphi 应用程序中获取 EOutOfMemory 之前的可用内存(地址空间)

java - 为什么 java 从具有大尺寸数字的第一个维度开始初始化二维数组需要很长时间?

c - 在 C 中合并数组中的位变量

memory-management - 按引用调用和按值返回调用有什么区别

c++ - 通过 sscan f 写入十六进制模式

c - volatile value-only 语句会触发 C 中的读访问吗?

java - 使用 ResultSet 时 mysql 内存 (RAM) 使用量增加?

arrays - 如何在 MIPS 中分配可变大小的数组?

c - 在 C 中立即(逐个数据包)从套接字接收 TCP 有效负载

c - 决定必须由 super 用户调用 setgroups() 和 initgroups() 的机制是什么?