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

8 c c++ memory elf

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

int main(){return 0;}
Run Code Online (Sandbox Code Playgroud)

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

我以为可能是因为int main(),我尝试为以下C程序创建目标文件:

void main(){}
Run Code Online (Sandbox Code Playgroud)

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

是因为某些最小尺寸的内存被分配给那些部分?

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

PSk*_*cik 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
Run Code Online (Sandbox Code Playgroud)

你可能是size一个完全链接的可执行文件.

$ gcc main.o -o main && size main
   text    data     bss     dec     hex filename
   1415     544       8    1967     7af main
Run Code Online (Sandbox Code Playgroud)


per*_*ror 8

实际上,如果使用附加到二进制文件的libc进行编译,则会在函数之前(和之后)添加main()函数.它们主要用于加载动态库(即使您不需要它),并在main()结束时正确卸载它.

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

这就是为什么,您将始终在使用libc编译的所有二进制文件中看到BSS和DATA.如果你想摆脱这个,那么你应该编写自己的汇编程序,比如this(asm.s):

.globl _start
 _start:
    mov %eax, %ebx
Run Code Online (Sandbox Code Playgroud)

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

$> gcc -nostdlib -o asm asm.s
Run Code Online (Sandbox Code Playgroud)

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