c - 除了原始机器指令外,可执行文件中还有什么?

标签 c assembly gcc executable

我正在寻求了解低级计算。我注意到编译后的二进制文件要比我认为的要大得多。因此,我尝试构建没有任何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

最佳答案

现代编译器和链接器并没有真正针对在完整规模的平台上生成超小型代码而进行过优化。不是因为工作困难,而是因为通常没有必要。不一定需要编译器或链接器添加其他代码(尽管可能会添加),但是它不会尝试将数据和代码打包到尽可能小的空间。
就您而言,我注意到您正在使用动态链接,即使实际上没有任何链接。使用“-static”将节省大约8kB。 “-s”(带)将消除更多。
我不知道gcc是否有可能制作真正最小的ELF可执行文件。在您的情况下,应该大约为400个字节,几乎所有字节都是各种ELF header ,节表等。
我不知道是否可以链接自己的网站(我敢肯定,如果没有的话,我会说正确的话),但是我有一篇文章介绍了如何通过从头开始用二进制文件生成一个ELF可执行文件:
http://kevinboone.me/elfdemo.html

关于c - 除了原始机器指令外,可执行文件中还有什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63980227/

相关文章:

c++ - 程序员的错误或 gcc-5.1.0 的错误?

c++ - GCC 不能使用未定义的运算符=

linux - 交叉编译 glibc 导致构建错误

C 语言中的复杂声明

c - 将 C 程序输出保存到文本文件

c - 以下代码片段中可能存在什么问题?

assembly - 平面二进制格式

assembly - 在 ti 84+ 上的 ti 基本程序中使用十六进制代码

c - 如何在C中将文件内容读取为字符串?

c - 为什么动态二进制翻译比静态二进制翻译更实用?