什么是交叉編譯呢,簡單地說,就是在一個平臺上生成另一個平臺上的可執行代碼。這里需要注意的是所謂
平臺,實際上包含兩個概念:體系結構 (Architecture)、操作系統(Operating System)。同一個體系結
構可以運行不同的操作系統;同樣,同一個操作系統也 可以在不同的體系結構上運行。舉例來說,我們常說
的x86 Linux平臺實際上是Intel x86體系結構和Linux for x86操作系統的統稱;而x86 WinNT平臺實際上是
Intel x86體系結構和Windows NT for x86操作系統的簡稱。
一 個經常會被問到的問題就是,“既然我們已經有了主機編譯器,那為什么還要交叉編譯呢?”其實答案很簡
單,沒辦法啊!有時是因為目的平臺上不允許或 不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器
的某些特征;有時是因為目的平臺上的資源貧乏,無法運行我們所需要編譯器;有時又是因為目 的平臺還沒
有建立,連操作系統都沒有,根本談不上運行什么編譯器。
另一個經常會被問到的問題就是:“既然可以交叉編譯,那還要主 機編譯干嗎?”其實答案也很簡單,交叉編
譯是不得已而為之!與主機編譯相比,交叉編譯受的限制更多,雖然在理論上我們可以做任何形式的交叉編
譯, 但事實上,由于受到專利、版權、技術的限制,并不總是能夠進行交叉編譯,尤其是在業余條件下!舉
例來說,我們至今無法生成惠普公司專有的som格 式的可執行文件,因此我們根本無法做目的平臺為
HPPA-HPUX的交叉編譯。
就我們這個項目而言,需要交叉編譯的原因有兩個: 首先,在項目的起始階段,目的平臺尚未建立,因此需
要做交叉編譯,以生成我們所需要的bootloader(啟動引導代碼)以及操作系統核心;其 次,當目的平臺能
啟動之后,由于目的平臺上資源的限制,當我們編譯大型程序時,依然可能需要用到交叉編譯。
三、 交叉編譯的基礎知識
在做實際工作之前,我想我們應該先掌握一些關于交叉編譯的基本知識,其實說白了也就是理解一些我們經
常會碰到的英文單 詞;)
host 主機平臺。
target 目的平臺。
perfix 交叉編譯器的安裝位置。
xxx-xxxx-xxxxx 平臺描述。
我們在主機平臺上開發程序,并在這個平臺上運行交叉編譯器,編譯我們的程序;而由交叉編譯器生
成的程序將在目的平臺 上運行。這里值得說明得是平臺描述,象arm-linux、i386-pc-linux2.4.3這樣的字
符串我們經常會看到,其實它是用來描述 平臺的,它有完整格式、縮減格式和別名之分。完整格式是:
CPU-制造廠商-操作系統,如sparc-sun-sunos4.1.4,說明平臺所 使用的CPU是sparc,制造廠商是sun,上面
運行的操作系統是SunOS,版本是4.1.4。當然,我們都不愿記這么長的東西,因此可以使 用短格式,短格式
中有選擇地去處了制造廠商、軟件版本等信息,因此我們同樣可以用sparc-sunos或sparc-sunos-sunos4 來
描述這個平臺。如果覺得這個還是太麻煩,那就可以使用別名,sun4m就可以很簡單地描述這個平臺。需要
注意的是,并不是所有的平臺都 有別名,也不是所有的短格式都可以正確地描述平臺。
四、我需要準備些什么
怎么說呢,你先得準備好主機平臺,對我 們這個項目來說,我們建議采用x86 Linux做主機平臺,因為這樣需
要的設置工作最少。當然你也可以使用你所喜歡的平臺或你所能得到的平臺, 其中的區別在于你可能必須做
更多的設置工作,當然也有這種可能,就是你所選擇的主機平臺根本不能生成適用于目標平臺的正確的交叉
編譯器。
對 于交叉編譯器,可以自己生成,也可以從網上下載。區別在于從網上下載非常簡單方便,但也許你找不到
適合你所選擇的平臺的。而自己生成交叉編譯器, 有時會遇到很多挫折,但這的確是個有趣的值得懷念的經
歷。
如果你想自己生成交叉編譯器,那你必須先準備下面這些東西
1、磁盤空間。至少要500M左右的空間,如果想一氣呵成的話,那就要 900M-1G的空間。
2、各種源代碼。你至少要準備binutils-2.11.2、gcc-2.95.3、linux-2.4.6、 newlib-1.8.2或glibc-2.2.2
的源代碼。
如果你所使用的主機平臺不是運行的linux,那你還必須注意以下 這些問題
1、GNU bash必須是默認shell,所以你也許得把/bin/sh改成bash。
2、你要確認已經安裝了GNU bison,因為這些軟經同樣使用了bison擴展。
3、GNU gmake最好是系統默認得make,因為這些軟件都使用了gmake擴展,如果不是,在需要make時,記得
使用gmake。
4、如果 你想生成交叉glibc,則GNU gsed必須是默認sed,因為glibc會用到gsed的擴展。
5、如果你想生成交叉glibc,那還必須 準備glibc-linuxthreads-2.2.2的源代碼。
6、確認正確的路徑搜索順序,最好讓GNU軟件首先被執行。
五、 怎樣生成交叉編譯器
我們建議使用現成的腳本來生成交叉編譯器,因為在配置交叉編譯器時,會經常使用一些難以理解的開關項。
待 續。。。。。。
六、參考文獻
http://www.objsw.com/CrossGCC/ 這是一個老牌的交叉編譯FAQ,可惜最近已經很少更新了。
http://crossgcc.billgatliff.com/ 這是一個新生的交叉編譯FAQ,目前更新比較頻繁。
crossgcc@sourceware.cygnus.com 交叉編譯器的郵件列表
原文: http://blog.csdn.net/gengqiang2008/archive/2008/12/19/3558511.aspx
平臺,實際上包含兩個概念:體系結構 (Architecture)、操作系統(Operating System)。同一個體系結
構可以運行不同的操作系統;同樣,同一個操作系統也 可以在不同的體系結構上運行。舉例來說,我們常說
的x86 Linux平臺實際上是Intel x86體系結構和Linux for x86操作系統的統稱;而x86 WinNT平臺實際上是
Intel x86體系結構和Windows NT for x86操作系統的簡稱。
一 個經常會被問到的問題就是,“既然我們已經有了主機編譯器,那為什么還要交叉編譯呢?”其實答案很簡
單,沒辦法啊!有時是因為目的平臺上不允許或 不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器
的某些特征;有時是因為目的平臺上的資源貧乏,無法運行我們所需要編譯器;有時又是因為目 的平臺還沒
有建立,連操作系統都沒有,根本談不上運行什么編譯器。
另一個經常會被問到的問題就是:“既然可以交叉編譯,那還要主 機編譯干嗎?”其實答案也很簡單,交叉編
譯是不得已而為之!與主機編譯相比,交叉編譯受的限制更多,雖然在理論上我們可以做任何形式的交叉編
譯, 但事實上,由于受到專利、版權、技術的限制,并不總是能夠進行交叉編譯,尤其是在業余條件下!舉
例來說,我們至今無法生成惠普公司專有的som格 式的可執行文件,因此我們根本無法做目的平臺為
HPPA-HPUX的交叉編譯。
就我們這個項目而言,需要交叉編譯的原因有兩個: 首先,在項目的起始階段,目的平臺尚未建立,因此需
要做交叉編譯,以生成我們所需要的bootloader(啟動引導代碼)以及操作系統核心;其 次,當目的平臺能
啟動之后,由于目的平臺上資源的限制,當我們編譯大型程序時,依然可能需要用到交叉編譯。
三、 交叉編譯的基礎知識
在做實際工作之前,我想我們應該先掌握一些關于交叉編譯的基本知識,其實說白了也就是理解一些我們經
常會碰到的英文單 詞;)
host 主機平臺。
target 目的平臺。
perfix 交叉編譯器的安裝位置。
xxx-xxxx-xxxxx 平臺描述。
我們在主機平臺上開發程序,并在這個平臺上運行交叉編譯器,編譯我們的程序;而由交叉編譯器生
成的程序將在目的平臺 上運行。這里值得說明得是平臺描述,象arm-linux、i386-pc-linux2.4.3這樣的字
符串我們經常會看到,其實它是用來描述 平臺的,它有完整格式、縮減格式和別名之分。完整格式是:
CPU-制造廠商-操作系統,如sparc-sun-sunos4.1.4,說明平臺所 使用的CPU是sparc,制造廠商是sun,上面
運行的操作系統是SunOS,版本是4.1.4。當然,我們都不愿記這么長的東西,因此可以使 用短格式,短格式
中有選擇地去處了制造廠商、軟件版本等信息,因此我們同樣可以用sparc-sunos或sparc-sunos-sunos4 來
描述這個平臺。如果覺得這個還是太麻煩,那就可以使用別名,sun4m就可以很簡單地描述這個平臺。需要
注意的是,并不是所有的平臺都 有別名,也不是所有的短格式都可以正確地描述平臺。
四、我需要準備些什么
怎么說呢,你先得準備好主機平臺,對我 們這個項目來說,我們建議采用x86 Linux做主機平臺,因為這樣需
要的設置工作最少。當然你也可以使用你所喜歡的平臺或你所能得到的平臺, 其中的區別在于你可能必須做
更多的設置工作,當然也有這種可能,就是你所選擇的主機平臺根本不能生成適用于目標平臺的正確的交叉
編譯器。
對 于交叉編譯器,可以自己生成,也可以從網上下載。區別在于從網上下載非常簡單方便,但也許你找不到
適合你所選擇的平臺的。而自己生成交叉編譯器, 有時會遇到很多挫折,但這的確是個有趣的值得懷念的經
歷。
如果你想自己生成交叉編譯器,那你必須先準備下面這些東西
1、磁盤空間。至少要500M左右的空間,如果想一氣呵成的話,那就要 900M-1G的空間。
2、各種源代碼。你至少要準備binutils-2.11.2、gcc-2.95.3、linux-2.4.6、 newlib-1.8.2或glibc-2.2.2
的源代碼。
如果你所使用的主機平臺不是運行的linux,那你還必須注意以下 這些問題
1、GNU bash必須是默認shell,所以你也許得把/bin/sh改成bash。
2、你要確認已經安裝了GNU bison,因為這些軟經同樣使用了bison擴展。
3、GNU gmake最好是系統默認得make,因為這些軟件都使用了gmake擴展,如果不是,在需要make時,記得
使用gmake。
4、如果 你想生成交叉glibc,則GNU gsed必須是默認sed,因為glibc會用到gsed的擴展。
5、如果你想生成交叉glibc,那還必須 準備glibc-linuxthreads-2.2.2的源代碼。
6、確認正確的路徑搜索順序,最好讓GNU軟件首先被執行。
五、 怎樣生成交叉編譯器
我們建議使用現成的腳本來生成交叉編譯器,因為在配置交叉編譯器時,會經常使用一些難以理解的開關項。
待 續。。。。。。
六、參考文獻
http://www.objsw.com/CrossGCC/ 這是一個老牌的交叉編譯FAQ,可惜最近已經很少更新了。
http://crossgcc.billgatliff.com/ 這是一個新生的交叉編譯FAQ,目前更新比較頻繁。
crossgcc@sourceware.cygnus.com 交叉編譯器的郵件列表
原文: http://blog.csdn.net/gengqiang2008/archive/2008/12/19/3558511.aspx