我遇到了size命令,该命令给出了ELF文件的节大小。在使用它的同时,我为最简单的C++程序创建了一个输出文件:
int main(){return 0;}
显然,我没有定义任何初始化或未初始化的数据,那么为什么我的BSS和DATA节的大小为512和8字节?
我以为可能是因为
int main()
,所以我尝试为以下C程序创建目标文件:void main(){}
对于BSS和DATA部分,我仍然没有得到0。
是因为某个最小大小的内存分配给了那些部分?
编辑-我认为可能是因为链接的库,但是我的对象是动态链接的,所以可能不应该成为问题
最佳答案
实际上,如果使用二进制文件附带的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段。
关于memory - Linux size命令,为什么bss和data部分不为零?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51968080/