打包了我用于上周将两个 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 大小下会建造什么。这个池子现在还很薄。
评论 (0)