从零构建 Linux:Bootstrappable Builds 揭秘
Bootstrappable Builds: How and Why
在 FOSSY 大会上,Timothy Sample 深入探讨了 Bootstrappable Builds 的概念。与可复现构建不同,它旨在从极小的种子程序开始,逐步构建出完整的现代 Linux 用户空间,确保代码来源完全透明。文章指出,传统的自托管编译器可能隐藏后门,正如 Ken Thompson 在 Turing Award 演讲中所警示的。通过 GNU Guix 和 mrustc 等工具,开发者正尝试通过“考古挖掘”或专用工具,解决这一信任危机,让软件自由不再止步于源代码的可见性,而是延伸至二进制文件的完全可验证性。
我们基本上是在用从贝尔实验室传下来的 Dennis Ritchie 的酵母来制作 C 编译器。
HN 评论区
53- robalni
我正在做一个项目,目标是构建一个从最小起点开始自举的完整环境。
我觉得像 hex0 这样的十六进制转二进制工具太像机器码了,我希望一切都是源代码,所以我选择从一种超级简单的解释型语言开始。这种语言用英语描述,用户需要自己用任何方式编写它的解释器。这样,我就能用人类的语言将人与计算机连接起来,我觉得这样感觉更好,也更容易理解。
这种超级简单的解释型语言随后会构建一个超级简单的 RISC-V 汇编器。在这里,我想到了一个不错的技巧:汇编器中的函数通过指针调用,这使得它们在汇编器运行时可以被替换。因此,一旦汇编器编译出了某个自身函数的更好版本,该函数就会在汇编器运行时被替换成这个更好的版本,然后继续编译剩余的代码,这些代码随后就可以使用新功能。所以,它可以在无需重启的情况下不断进化。
- 0xDEAFBEAD
有了 AI,肯定可以朝相反的方向走,利用逆向工程软件重构出类似原始源代码的东西,并自动检查功能差异。这样的话,你只需要信任你的逆向工程软件(以及你的系统环境等,我猜)。那样会不会更容易?
- moring
> The hex0 program provides a way to turn a string of hexadecimal text into a binary with those bytes.
我想用这个来请教一个关于核心思想的问题:十六进制文本为什么比二进制 blob 更好?两者都需要详细的知识才能理解;两者都需要工具来显示(无论是读取 ASCII 还是二进制),而其中任何一种工具在“信任信任”(trusting trust)的意义上都可能被篡改。
在我看来,初始“种子”真正重要的方面是它的体积(越大越难验证),以及所使用的语言(无论是 Lisp、二进制机器码还是其他)拥有严格定义的语义。
(与此正交的是,你会希望将所有内容,包括种子和其余部分,存储在一个无法向你隐藏任何东西的介质上,并将其作为源代码。但这适用于所有方法。)
- lrvick
得益于这个团队令人难以置信的工作,我们从第一天起就通过这种方式全源码自举了我们的 100% 确定性、法定人数签名、LLVM/musl 原生以及容器原生的发行版。可自举的构建解锁了 stagex,而 stagex 解锁了可远程证明的启动,可以追溯信任链,从实时服务器启动一直回溯到 hex0。
- andrewchambers
非常希望看到有人尝试自动化从可用的 C89 编译器到 Rust 的自举链。
到了这个阶段,我认为当前的 LLM 能够帮助完成这些惊人的自举壮举,因为它们可以连续数天或数周地处理那些长得令人难以置信的构建时间。
我对确定性构建整体非常乐观。