为什么BSS细分市场是" 16"默认情况下?

时间:2015-03-10 11:02:06

标签: c linux size storage-class-specifier

据我所知,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

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

1 个答案:

答案 0 :(得分:2)

在使用gcc的Windows上情况更糟:

main.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库),你得到一个&#34;可执行文件&#34;正是你编译的内容和bss大小为0:

main.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

然而,可执行文件不会运行!