Cross-Compilation

為什麼在 Linux From Scratch 中使用 Canadian Cross 進行交叉編譯?

  • September 16, 2021

我正在閱讀Linux From Scratch 11.0 這本書。在III. 建構 LFS 跨工具鍊和臨時工具,ii。Toolchain Technical Notes,有一點關於加拿大交叉編譯的內容。我不明白為什麼需要 3 個階段和 3 台機器才能達到最終結果。本文假設我們從電腦 A 和一個在 A 上執行並為 A 生成二進製文件的編譯器開始。那麼為什麼我們不直接使用該編譯器來建構一個在 C 上執行並為 C 建構二進製文件的編譯器呢?為什麼會有這麼多麻煩,建構一個在 A 上執行但為 B 建構的編譯器,然後是在 B 上執行但為 C 建構的編譯器,最後是在 C 上執行並為 C 建構的編譯器?

我還在 Wikipedia 上找到了一篇關於它的文章 - https://en.wikipedia.org/wiki/Cross_compiler

首先,電腦 C 不是你可以實際編譯的東西。它可能是嵌入式設備,甚至只是您不想設置用於編譯的生產機器。

所以你有這樣一台’nix機器。你需要能夠交叉編譯它。

你所擁有的是一台建構機器。這是B。它是一台足夠快、足夠強大的機器,但它沒有編譯器。它甚至沒有為 B 建構的編譯器,更不用說為 C 建構的編譯器了。你想用它為 C 建構東西。

你怎麼得到它?好吧,您與擁有 B 編譯器的人交談,最好是直接交叉編譯為 C 的編譯器。然後將其下載到 B,並使用它為您的定制系統 C 進行交叉編譯。

他們從哪裡獲得 B 的編譯器?很可能他們的系統與 B 不同。他們是如何開始的?

他們真正需要的只是一個系統 A,它帶有一個為 A 編譯程序的編譯器。

現在,已經安裝在 A 上的這個編譯器可能無法建構交叉編譯器。它只是供應商或其他東西提供的語言(如c )的一些編譯器。

您需要的是一個可以為 B 編譯二進製文件的交叉編譯器。為此,首先將 A 帶到 A 編譯器(您的“供應商”編譯器),然後編譯一個支持交叉編譯到 B 的編譯器。

接下來,你使用那個編譯器,你讓它編譯一個從 B 編譯到 C 的交叉編譯器。

然後,您將該B 到 C 編譯器分發給擁有電腦 B 和 C 的人。

現在,這是(並且曾經是)一個現實世界的問題。您有一台帶有供應商編譯器的 microsoft windows 機器、solaris unix 機器或 macOS 機器。在所有情況下,您都可以輕鬆獲得編譯器,但不能獲得交叉編譯器。這些供應商對為您提供交叉編譯器幾乎沒有興趣。

您沒有向您提供工具的每個人都擁有的電腦(B 和 C)。因此,您從“鎖定”系統 A 引導到能夠建構和分發全套預建構工具供使用者下載。

“硬”要求是電腦 A 有一個編譯器,可以將 B 到 C 的交叉編譯器編譯;其中編譯器的執行指令集和編譯器的目標指令集對 A 都是陌生的。

描述的場景是這樣的

  • 機器 A 很慢並且有編譯器
  • 機器 B 速度很快,但沒有編譯器
  • 機器 C 是目標,但它很慢,並且沒有編譯器

您可以在 A 上為 C 建構所有二進製文件,但這需要很長時間,因為機器 A 很慢。

作者認為,在 A 上交叉編譯 B 的編譯器是值得的。然後可以使用快速機器 B 交叉編譯慢速機器 C 的所有必要二進製文件,從而導致總時間避免在 A 或 C 上編譯。

最後一步,在 C 上為 C 建構編譯器,就是簡單地刪除對機器 B 的依賴。雖然速度很慢,但機器 C 現在可以直接編譯偶爾出現的程序本身。

引用自:https://unix.stackexchange.com/questions/668844