为什么 BSS 段默认为“16”?
Why BSS segment is "16" by default?
据我所知,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
因为我不是 declaring/initializing 任何 global/static 变量?
使用 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 库),您将得到一个 "executable" 与您编译的内容完全相同且 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
然而,可执行文件不会 运行!
据我所知,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
因为我不是 declaring/initializing 任何 global/static 变量?
使用 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 库),您将得到一个 "executable" 与您编译的内容完全相同且 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
然而,可执行文件不会 运行!