【发布时间】:2020-12-19 11:22:25
【问题描述】:
我正在寻求了解低级计算。我注意到我编译的二进制文件比我认为的要大得多。所以我尝试在没有任何 stdlib 代码的情况下构建尽可能小的 c 程序,如下所示:
void _start()
{
while(1) {};
}
gcc -nostdlib -o minimal minimal.c
当我解开二进制文件时,它向我展示了我所期望的,即三行汇编中的确切代码。
$ objdump -d minimal
minimal: file format elf64-x86-64
Disassembly of section .text:
0000000000001000 <_start>:
1000: 55 push %rbp
1001: 48 89 e5 mov %rsp,%rbp
1004: eb fe jmp 1004 <_start+0x4>
但我的实际可执行文件大小仍为 13856 字节。是什么,让这个这么大?那个文件里还有什么?操作系统是否需要超过这 6 个字节的机器码?
编辑#1:
size 的输出为:
$ size -A minimal
minimal :
section size addr
.interp 28 680
.note.gnu.build-id 36 708
.gnu.hash 28 744
.dynsym 24 776
.dynstr 1 800
.text 6 4096
.eh_frame_hdr 20 8192
.eh_frame 52 8216
.dynamic 208 16176
.comment 18 0
Total 421
【问题讨论】:
-
可执行文件包含的信息远不止代码本身。它可以在不同的操作系统和可执行文件类型之间变化。
-
如果你把它作为一个精灵链接,那不是低级的。
-
另见例如this tutorial 关于如何创建最小的可执行文件。
-
如果你编译一个没有帧指针的 16 位 MSDOS .COM 程序,你最终只会得到代码。正如上面已经评论过的,对于大多数当前的操作系统,除了编译的代码之外,还有一些信息。
标签: c assembly gcc executable