linux - 为什么从头开始构建 Linux (LFS) 需要多次通过?

标签 linux gcc linux-from-scratch

我正在尝试理解 Linux From Scratch 的概念,并且想知道为什么构建 binutilsgcc 等需要多次通过。

为什么我们需要 pass1 和 pass2 分开?为什么我们不能在 pass 1 中构建工具,然后使用它们构建 gccglibclibstdc++ 等。

最佳答案

目标是确保您的构建是一致的,无论您使用哪个编译器来编译您的编译器(以及该编译器有哪些错误)。

假设您正在使用 gcc 3.2 构建 gcc 4.1(我将把 gcc 3.2 称为“stage-0”)。为 gcc 4.1 做 QA 的人没有测试它在使用 gcc 4.1 以外的任何编译器构建时是否正常工作——因此,需要首先构建一个 stage-1 gcc,然后使用那个 stage-1编译第 2 阶段编译器,以防止第 0 阶段编译器中的任何错误影响最终结果。

然后,gcc 的默认编译过程使用 stage-2 编译器构建 stage-3 编译器,并比较两个二进制文件:它们之间的任何差异都可以用作存在证明一个错误。

(当然,这只是一种避免意外错误的有效机制;请参阅经典的 Ken Thompson 论文 Reflections on Trusting Trust,了解如何避免有意的错误这种措施)。


这超越了 gcc 进入整个工具链,因为相同的原则贯穿始终:如果在运行 glibc-x.y 的系统和运行 glibc-x 的系统上构建 glibc-x.y 的结果有任何差异。(y-1 ) 并且您做额外的传递以确保您在与目标环境相匹配的情况下进行构建,然后重现这些错误(和测试建议的修复)会比其他方式困难得多情况是这样的:没有您的(通常是未公开的)构建环境的任何人都无法重现错误!

关于linux - 为什么从头开始构建 Linux (LFS) 需要多次通过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39883865/

相关文章:

linux - Centos/Linux 将 logrotate 设置为所有日志的最大文件大小

c - ‘mc’ 在单词 'mcmodel=medium' 中意味着什么?

linux - 创建 iso 格式的操作系统镜像

Linux从零开始,Glibc-2.16 make报错

linux - zsh 替换:(P) 和::= 运算符交互

linux - 将 Debian 7.8 升级到 8.7 后 Jenkins 无法启动

php - 通过 PHP 和 SSH 的 Git : ssh authentification of user apache denied

macos - 64 位 Mac OS X Lion 上的 nasm/gcc 问题

linux - gcc-4.7 与 Debian 8 杰西

linux - 用于 GPT 分区表的引导分区类型