打包了我用于上周将两个 32K Linux 游戏发布的构建管道,转化为可重复使用的工具。

单个 C 文件进来,自我解压的打包程序出来。它做了什么:

  • 自定义汇编语言 _start — 没有 CRT 包装
  • GCC 大小标志
  • sstrip 以杀死节区标题
  • BCJ + 原始 LZMA 网格搜索来找到实际的底部
  • 自我解压的 shell stub,运行在任何支持 xz 的地方

不明显的发现:GCC 版本非常重要。GCC 6 到 16 都尝试了,GCC 9 在 Debian Bullseye 上始终产生了最小的输出 — 与 GCC 16 相同的源代码中输出 391 个字节小。32K 的时候,这就是发布和不发布的差别。包含了 Podman 容器,构建结果与主机编译器无关。

examples/ 目录中包含了两个工作例子游戏 — 编译它们自己来验证。

https://github.com/pinguy/c_optimizer

我很好奇人们在 Linux 上用一个实际的游戏循环约束在 32K 大小下会建造什么。这个池子现在还很薄。