我试图了解Linux From Scratch的概念,并想知道为什么要通过多次构建binutilsgcc等。

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

最佳答案

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

假设您要使用gcc 3.2构建gcc 4.1(我将把gcc 3.2称为“stage-0”)。使用gcc 4.1以外的任何编译器进行gcc 4.1质量检查的人们都没有测试它能否正常工作-因此,需要先构建一个stage-1 gcc,然后使用那个stage-1来编译一个gcc。阶段2编译器,以防止阶段0编译器中的任何错误影响最终结果。

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

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

这超出了gcc进入整个工具链的范围,因为相同的原则贯穿始终:如果在运行glibc-xy的系统和运行glibc-x的系统上构建glibc-xy的结果有任何不同。(y-1)不要做额外的检查,以确保您在针对目标环境的匹配中进行构建,然后要比那些其他情况更加困难地再现这些错误(并测试建议的修复程序):没有人没有您的(通常未公开的)构建环境可能会重现该错误!

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

10-13 09:15
查看更多