Linux size命令,为什么bss和data部分不为零?

时间:2018-08-22 06:55:44

标签: memory c c++ elf

我遇到了size命令,该命令给出了ELF文件的节大小。在使用它的同时,我为最简单的C ++程序创建了一个输出文件:

int main(){return 0;}

很明显,我还没有定义任何初始化或未初始化的数据,那么为什么我的BSS和DATA部分的大小为512和8字节?

我认为可能是由于int main()导致的,我尝试为以下C程序创建目标文件:

void main(){}

对于BSS和DATA部分,我仍然没有得到0。

是因为某些最小大小的内存分配给了那些部分?

编辑-我以为可能是因为链接的库,但是我的对象是动态链接的,所以可能不应该是问题

2 个答案:

答案 0 :(得分:10)

int main(){return 0;}仅将数据放入.text

$ echo 'int main(){return 0;}' | gcc -xc - -c -o main.o && size main.o
   text    data     bss     dec     hex filename
     67       0       0      67      43 main.o

您可能size正在创建一个完全链接的可执行文件。

$ gcc main.o -o main && size main
   text    data     bss     dec     hex filename
   1415     544       8    1967     7af main

答案 1 :(得分:8)

实际上,如果使用二进制文件附带的libc进行编译,则在main()函数之前(和之后)添加了一些函数。他们主要是在这里加载动态库(即使您不需要使用动态库),并在main()结束后正确地卸载它。

这些函数具有需要存储的全局变量; BSS段中有未初始化(初始化为零)的全局变量,而DATA段中有未初始化的全局变量。

这就是为什么,您始终会在使用libc编译的所有二进制文件中看到BSS和DATA。如果要摆脱这种情况,则应编写自己的汇编程序,例如(asm.s):

.globl _start
 _start:
    mov %eax, %ebx

然后,在没有libc的情况下进行编译:

$> gcc -nostdlib -o asm asm.s

您应该减少此ELF二进制文件的BSS和DATA段的占用空间。