我遇到了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/

10-12 18:20