我遇到了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)
实际上,如果使用附加到二进制文件的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段的占用空间.
| 归档时间: |
|
| 查看次数: |
917 次 |
| 最近记录: |