我遇到了size命令,该命令给出了ELF文件的节大小。在使用它的同时,我为最简单的C ++程序创建了一个输出文件:
int main(){return 0;}
很明显,我还没有定义任何初始化或未初始化的数据,那么为什么我的BSS和DATA部分的大小为512和8字节?
我认为可能是由于int main()
导致的,我尝试为以下C程序创建目标文件:
void main(){}
对于BSS和DATA部分,我仍然没有得到0。
是因为某些最小大小的内存分配给了那些部分?
编辑-我以为可能是因为链接的库,但是我的对象是动态链接的,所以可能不应该是问题
答案 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段的占用空间。