gpt4 book ai didi

c - 为什么BSS段默认是 "16"?

转载 作者:IT王子 更新时间:2023-10-29 00:34:55 26 4
gpt4 key购买 nike

据我所知,c程序的分割是:

        High address
|---------------------------|
|env/cmd line args vars |
|---------------------------|
| stack segment |--> uninitialized auto vars
|---------------------------|
|---------------------------|
|---------------------------|
| heap segment |--> dynamic allocated memory
|---------------------------|
| BSS segment |--> uninitialized static/global vars
|---------------------------|
| data segment |--> initialized static/global vars
|---------------------------|
| text segment |--> initialized auto vars/exec instructions
|---------------------------|
Low address

在我的 RHEL 5.4 64 位机器上,用于以下 c 程序

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

当我这样做时:

# size a.out
text data bss dec hex filename
1259 540 16 1815 717 a.out

我无法理解这是为什么

bss=16

因为我没有声明/初始化任何全局/静态变量?

最佳答案

在带有 gcc 的 Windows 上更糟:

主.c:

#include <stdio.h>

int main( int argc, char* argv[] )
{
return 0;
}

编译:

C:\>gcc main.c

尺寸:

C:\>size a.exe
text data bss dec hex filename
6936 1580 1004 9520 2530 a.exe

bss 包括整个链接的可执行文件,在这种情况下链接了各种库,其中确实使用静态 c 初始化。

使用 -nostartfiles在 Windows 上获得更好的结果。您也可以尝试使用 -nostdlib 和 -nodefaultlibs

编译:

C:\>gcc -nostartfiles main.c

尺寸:

C:\>size a.exe
text data bss dec hex filename
488 156 32 676 2a4 a.exe

删除所有库(包括 c 库),您将获得一个“可执行文件”,其中包含您所编译的内容以及大小为 0 的 bss:

主.c:

#include <stdio.h>

int _main( int argc, char* argv[] )
{
return 0;
}

编译:

C:\>gcc -nostartfiles -nostdlib -nodefaultlibs main.c

尺寸:

C:\>size a.exe
text data bss dec hex filename
28 20 0 48 30 a.exe

但是可执行文件不会运行!

关于c - 为什么BSS段默认是 "16"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28962014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com