binutils
Linux From Scratch の概念を理解しようとしていますが、ビルドgcc
などに複数のパスがある理由を知りたいです。
なぜ pass1 と pass2 が別々に必要なのですか? gcc
パス 1 でツールをビルドしてから、それらを使用して、glibc
、libstdc++
などをビルドできないのはなぜですか。
binutils
Linux From Scratch の概念を理解しようとしていますが、ビルドgcc
などに複数のパスがある理由を知りたいです。
なぜ pass1 と pass2 が別々に必要なのですか? gcc
パス 1 でツールをビルドしてから、それらを使用して、glibc
、libstdc++
などをビルドできないのはなぜですか。
目標は、コンパイラのコンパイルに使用しているコンパイラ (およびコンパイラにどのようなバグがあるか) に関係なく、ビルドの一貫性を確保することです。
gcc 3.2 で gcc 4.1 を構築しているとしましょう (gcc 3.2 を「stage-0」と呼びます)。gcc 4.1 の QA を行った人々は、gcc 4.1 以外のコンパイラでビルドした場合に正しく動作することをテストしていませんでした。ステージ 2 コンパイラ: ステージ 0 コンパイラのバグが最終結果に影響を与えるのを防ぎます。
次に、gcc のデフォルトのコンパイル プロセスは、ステージ 2 コンパイラを使用してステージ 3 コンパイラを構築し、2 つのバイナリを比較します。それらの違いは、バグの存在の証拠として使用できます。
(もちろん、これは意図しないバグを回避するための効果的なメカニズムにすぎません。意図されたバグがこの種の対策でどのように生き残ることができるかについての議論については、Ken Thompson の古典的な論文Reflections on Trusting Trustを参照してください)。
同じ原則が全体に適用されるため、これは gcc を超えてツールチェーン全体に適用されます。ターゲット環境に合わせて構築していることを確認するために余分なパスを実行しないでください。その場合、それらのバグを再現する (および提案された修正をテストする) ことは、そうでない場合よりもはるかに困難になります。あなたの (通常は公開されていない) ビルド環境は、必ずバグを再現できます!