据我所知,C语言程序的分段是这样的:
在我的RHEL 5.4 64位机器上,对于以下C程序:
当我执行以下操作时:
我不理解为什么会出现bss=16,因为我没有声明或初始化任何全局/静态变量。
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,因为我没有声明或初始化任何全局/静态变量。
objdump -S ./a.out
输出,以了解应该是简单代码周围有多少代码。您的理解是正确的,只是编译器“悄悄地”添加了支持库。 - Brian Sidebothamgcc -v main.c
并检查最终的链接步骤,以查看系统链接了哪些库。在我的 Windows 系统下,它是-lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt c:/.../crtend.o
链接了相当多的库,尽管大多数都是 DLL。 - Brian Sidebotham