2013-12-08 45 views
1

我想構建一個gcc交叉編譯器。我知道在編譯交叉編譯器之前,我需要已經構建了目標binutils。爲什麼編譯器的構建需要目標binutils?編譯器本身只需要高級代碼並將其轉換爲我在編譯器源代碼中定義的程序集。那麼爲什麼我需要目標bintools來編譯交叉編譯器呢?它是在所有交叉編譯器文檔中編寫的,我需要在編譯交叉編譯器之前構建它們。 (例如,http://wiki.osdev.org/Building_GCChttp://www.ifp.illinois.edu/~nakazato/tips/xgcc.html)。gcc編譯器之前建立binutils

回答

1

你的關鍵的問題似乎是:

爲什麼編譯器的建設需要的目標binutils的?

Building a cross compiler所描述的,用於GNU交叉編譯器生成過程的一部分是建立運行時庫用於使用新編譯的交叉編譯器的對象。所以目標的binutils需要在那一步才能成功。

可以有可能首先構建交叉編譯器,使用空文件binutils組件的子集gcc需要 - 例如asldarranlib - 然後構建和安裝目標binutils組件到適當的位置,然後構建目標運行時庫。

但它會更不容易出錯做事以下方式(以及文檔建議此):目標打造binutils首先,放置在gcc的源代碼樹中指定的可執行文件,然後構建交叉編譯器。

1

GCC需要一個彙編程序將其生成的程序集轉換爲目標文件(機器代碼),以及將目標文件鏈接在一起以生成可執行文件和共享庫的鏈接程序。它還需要一個存檔器來生成靜態庫/檔案。 GNU彙編as,接頭ldar歸檔:

這三個通常由binutils包(除其他有用的工具)提供。

+0

我正在編譯linux上的交叉編譯器,它將在linux上運行,但會爲其他機器(host!= linux)生成exe文件。所以當我編譯交叉編譯器時,我需要使用當前操作系統的as和ld。所以在我的理解中,爲了編譯交叉編譯器,我不需要主機binutils。每當我想爲主機編譯源代碼時,我只需要主機bintools,而不需要交叉編譯器的輸出,而必須使用主機的as和ld。所以我的問題是,爲什麼我在編譯交叉編譯器之前需要它們? – yehudahs

+0

您至少需要彙編程序爲目標構建類似'crt * .o'的東西,並且可能還需要鏈接器(尤其是如果您要構建C++標準庫)。 – Mat

+0

好吧,我明白,編譯目標的源時,我需要目標bintools,但它不回答問題,爲什麼我需要它們來構建交叉編譯器。我不打算在目標上運行交叉編譯器...我在主機上運行它,但是將它生成的exe文件運行到目標上....在上面的註釋中,當我寫主機時,我的意思是目標。 – yehudahs

0

Binutils的(二進制工具)提供low-level handling of binary files,如linkingassembling,和parsing ELF files。 GCC 編譯器依賴於這些工具來創建executable,因爲它會生成 binutils組裝成可執行映像的目標文件。

ELF是Linux用於二進制可執行文件 文件的格式。 GCC編譯器依賴於binutils來提供大部分的platform-specific functionality

在這裏,您正在交叉編譯的其他一些架構不適用於x86。所以產生的binutils是platform-specific

而配置必須給--host!=目標。即--host = i686-pc-linux-gnu 其中--target = arm-none-linux-gnueabi。 因此生成的可執行文件與主機已經有binutils不一樣。

另外 基本的東西需要知道。

build machine,其中構建了工具鏈。

host machine,其中工具鏈將被執行。

target machine,其中執行由 工具鏈創建的二進制文件。

因此,binutils將擁有工具來生成和操作給定CPU架構的二進制文件 。不爲一臺主機使用

+0

我想你誤解了我 - 爲什麼我需要目標bintools才能編譯交叉編譯器? – yehudahs