只有170字节?最小的64位Hello World程序原来是这样

💡 原文中文,约12700字,阅读约需31分钟。
📝

内容提要

本文介绍了C语言Hello World程序的底层实现和优化方法,包括编译过程、最小64位程序、汇编语言调用系统调用、编译链接装载的重要性以及压缩程序体积的方法。

🔎

延伸解读

从16K到170字节:体积缩减的关键步骤

文章通过逐步优化,将Hello World程序从16K缩减到170字节。关键步骤包括:剔除符号表、移除启动文件、不使用标准库、自定义链接脚本、改用汇编语言,以及手动生成ELF文件。每一步都针对性地减少了不必要的开销,最终实现了极致的体积控制。

Shebang与内核加载机制

文章解释了Shebang的工作原理:内核在加载文件时,会读取前128字节判断类型。对于包含Shebang的脚本,内核会启动指定的解释器,并将脚本路径作为参数传入。此外,还提到了/usr/bin/env的作用,它能在PATH中搜索解释器,确保脚本的可移植性。

自定义链接脚本与对齐优化

默认链接脚本会对齐节区,导致可执行文件中存在大量填充零,增加体积。通过编写自定义链接脚本,可以控制节区的对齐方式,避免不必要的空间浪费。文章中使用自定义链接脚本后,程序大小从12912字节骤降至584字节,效果显著。

手动生成ELF:对每个字节的精确控制

最终步骤是手动编写汇编代码并使用nasm直接生成二进制文件,完全控制ELF头、程序头和代码数据。这样生成的170字节程序,包含了ELF头(64字节)、程序头(56字节)、代码(37字节)和字符串数据(13字节),可在任意x64 Linux系统上运行。

❓

Q&A

最小的64位Hello World程序有多大?

最小的64位Hello World程序只有170字节。

如何编写一个最小的64位Hello World程序?

编写最小的64位Hello World程序需要逐步优化:从C程序开始,剔除符号表、移除启动文件、不使用标准库、自定义链接脚本、使用汇编语言,最后手动生成ELF文件,最终得到170字节的程序。

为什么简单的Hello World程序会占用16K空间?

因为默认的编译链接过程会包含启动文件、标准库、符号表等,并且链接脚本会对齐节区,导致程序体积较大。

如何减小Hello World程序的体积?

可以通过剔除符号表、移除启动文件、不使用标准库、自定义链接脚本、使用汇编语言以及手动生成ELF文件等方法来减小体积。

Shebang是什么?它在脚本中起什么作用?

Shebang是脚本文件的第一行,以#!开头,指明执行该脚本所需的解释器。内核在加载文件时会根据Shebang调用相应的解释器来执行脚本。

为什么在Shebang中经常使用/usr/bin/env?

因为/usr/bin/env会在PATH环境变量中搜索程序并执行,这样脚本可以不管解释器安装在何处都能正确执行。

🏷️

标签

➡️

继续阅读