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