Ubuntu8.04下的ARM交叉編譯工具鏈(arm-linux-)詳細(xì)介紹_第1頁(yè)
Ubuntu8.04下的ARM交叉編譯工具鏈(arm-linux-)詳細(xì)介紹_第2頁(yè)
Ubuntu8.04下的ARM交叉編譯工具鏈(arm-linux-)詳細(xì)介紹_第3頁(yè)
Ubuntu8.04下的ARM交叉編譯工具鏈(arm-linux-)詳細(xì)介紹_第4頁(yè)
Ubuntu8.04下的ARM交叉編譯工具鏈(arm-linux-)詳細(xì)介紹_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、原文鏈接與:實(shí)驗(yàn)室的機(jī)器配置太低,速度太慢實(shí)在是受不了。說是已經(jīng)升級(jí)了,內(nèi)存從128M升級(jí)到了256M。My god!這年頭還能到什么地方找那么多128的內(nèi)存條去阿?哇嘎嘎。真是服了。哈哈打開一個(gè)pdf文件要等老半天?;旧蠜]有辦法工作。于是想在自己的筆記本上做一個(gè)交叉編譯環(huán)境。我的機(jī)器配置也不高,但是相對(duì)于實(shí)驗(yàn)室的機(jī)器來說已經(jīng)相當(dāng)不錯(cuò)了。我的機(jī)器是單操作系統(tǒng):只有Ubuntu8.0.4。感覺和windows XP差不多。XP下有的東西,ubuntu下基本上也有。ps:昨天是我的生日。昨天上午有課,一下午還有今天上午就是在交叉編譯的過程中度過的。感覺整個(gè)過程挺考驗(yàn)?zāi)托牡摹O旅孢M(jìn)入正題。待續(xù)。最

2、近兩天內(nèi)補(bǔ)充完整。*在進(jìn)行嵌入式在進(jìn)行嵌入式開發(fā)之前,首先要建立一個(gè)交叉編譯環(huán)境,這是一套編譯器、連接器和libc庫(kù)等組成的開發(fā)環(huán)境。本文結(jié)合自己做嵌入式交叉編譯開發(fā)工作的經(jīng)驗(yàn),同時(shí)結(jié)合自己的體會(huì),做了一個(gè)介紹隨著消費(fèi)類電子產(chǎn)品的大量開發(fā)和應(yīng)用和Linux操作系統(tǒng)的不斷健壯和強(qiáng)大,嵌入式系統(tǒng)越來越多的進(jìn)入人們的生活之中,應(yīng)用范圍越來越廣。在裁減和定制Linux,運(yùn)用于你的嵌入式系統(tǒng)之前,由于一般嵌入式開發(fā)系統(tǒng)存儲(chǔ)大小有限,通常你都要在你的強(qiáng)大的pc機(jī)上建立一個(gè)用于目標(biāo)機(jī)的交叉編譯環(huán)境。這是一個(gè)由編譯器、連接器和解釋器組成的綜合開發(fā)環(huán)境。交叉編譯工具主要由 binutils、gcc 和 glib

3、c 幾個(gè)部分組成。有時(shí)出于減小 libc 庫(kù)大小的考慮,你也可以用別的 c 庫(kù)來代替 glibc,例如 uClibc、dietlibc 和 newlib。建立一個(gè)交叉編譯工具鏈?zhǔn)且粋€(gè)相當(dāng)復(fù)雜的過程,如果你不想自己經(jīng)歷復(fù)雜的編譯過程,網(wǎng)上有一些編譯好的可用的交叉編譯工具鏈可以下載。交叉編譯介紹 交叉編譯就是在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)上的可執(zhí)行代碼。 這里說的平臺(tái)分別指的是主機(jī)平臺(tái)Host和目標(biāo)平臺(tái)Target。 就我們?cè)贏RM平臺(tái)上移植Linux來說,Host是一臺(tái)一般的PC機(jī),它通過串口或網(wǎng)絡(luò)接口與Target通 信;Target是arm-linux平臺(tái)(這里說的arm指的是平臺(tái)所使用的CPU

4、是ARM9處理器,linux指的是運(yùn)行的操作系統(tǒng)是Linux)。 我們?cè)贖ost上開發(fā)程序,并在這個(gè)平臺(tái)上運(yùn)行交叉編譯器Cross Complier,編譯我們的程序,而由Cross Complier生成的程序?qū)⒃赥arget上運(yùn)行。 目前常用的交叉開發(fā)環(huán)境主要有開放和商業(yè)兩種類型。 開放的交叉開發(fā)環(huán)境的典型代表是GNU工具鏈,目前已能夠支持x86、ARM、PowerPC等多種處理器。 商業(yè)的交叉開發(fā)環(huán)境主要有Metrowerks CodeWarrior、ARMSoftware Development Toolkit等。常用在ARM平臺(tái)的GNU Toolchain: arm-linux-gcc:

5、交叉編譯linux內(nèi)核 arm-elf-gcc:主要交叉編譯uclinux內(nèi)核 arm-uclinux-gcc:交叉編譯uclinux內(nèi)核主要下載網(wǎng)址(網(wǎng)址)下載下來之后的幾種安裝方式: sh腳本方式安裝(.sh) sh arm-elf-tools-20030314.sh tar解壓方式安裝(.tar.gz) tar zxvf arm-linux-gcc-2.95.3.tar.gz rpm安裝包方式安裝(.rpm) rpm ivh arm-linux-gcc-2.95.3-3.i386.rpm rpm ivh arm-linux-binutils-2.12.1-1.i386.rpm rpm i

6、vh arm-linux-glibc-2.2.5-1.i386.rpm 安裝目錄:/usr/local/bin/arm-elf-xxx/usr/local/arm-linux/bin/arm-linux-xxx/usr/local/arm-uclinux-tool/bin/arm-uclinux-xxx為了在命令行中能夠?qū)ふ业浇徊婢幾g器,我們需要把他所在的路徑加入到PATH環(huán)境變量中(例:/usr/local/arm/bin:$PATH )。交叉編譯環(huán)境的組成: binutils工具包:包括連接器、匯編器以及其他用于目標(biāo)文件和檔案的工具,如as匯編器,ld連接器等。 gcc工具包:工具鏈的主角

7、,包括c編譯器gcc、c+編譯器g+等。 glibc庫(kù):提供系統(tǒng)調(diào)用的基本函數(shù)的C庫(kù),比如,printf、open等。 gdb調(diào)試工具:運(yùn)行在target上的調(diào)試程序,通過串口和TCP/IP和主機(jī)連接,進(jìn)行遠(yuǎn)距離調(diào)試。需要交叉編譯的原因: 首先,在項(xiàng)目的起始階段,目標(biāo)平臺(tái)尚未建立,因此需要做交叉編譯,以生成我們所需要的Bootloader以及kernel(因?yàn)锽ootloader和kernel的源碼需要經(jīng)過交叉編譯后才可以在目標(biāo)平臺(tái)上運(yùn)行); 其次,當(dāng)目標(biāo)平臺(tái)能啟動(dòng)之后,由于目標(biāo)平臺(tái)上資源的限制,當(dāng)我們編譯大型程序時(shí),依然可能需要用到交叉編譯。因此,建立交叉編譯環(huán)境是進(jìn)行嵌入式軟件開發(fā)的第一步

8、。下面我們將以建立針對(duì)arm的交叉編譯開發(fā)環(huán)境為例來說明整個(gè)交叉編譯器DIY的過程,其他的體系結(jié)構(gòu)與這個(gè)相類似,只要作一些對(duì)應(yīng)的改動(dòng)。我的開發(fā)環(huán)境是,宿主機(jī) i386-ubuntu-8.04,目標(biāo)機(jī)arm。因?yàn)長(zhǎng)inux內(nèi)核版本多,不同的版本存在不同的bug,加之眾多版本的工具鏈也存在不同的bug,這些bug針對(duì)不同的硬件(比如CPU類型等),需要多方測(cè)試,尋找合適的補(bǔ)丁程序。我是從網(wǎng)上看到大家都按如下的這個(gè)過程進(jìn)行(我也是這么做的):1. 下載源文件、補(bǔ)丁和建立編譯的目錄2. 建立內(nèi)核頭文件3. 建立二進(jìn)制工具(binutils)4. 建立初始編譯器(bootstrap gcc)5. 建立c

9、庫(kù)(glibc)6. 建立全套編譯器(full gcc)(一)下載源文件、補(bǔ)丁和建立編譯的目錄1. 選定軟件版本號(hào)選擇軟件版本號(hào)時(shí),先看看glibc源代碼中的INSTALL文件。那里列舉了該版本的glibc編譯時(shí)所需的binutils 和gcc的版本號(hào)。例如在 glibc-2.2.3/INSTALL 文件中推薦 gcc 用 2.95以上,binutils 用 2.10.1 以上版本。網(wǎng)上有推薦的如下比較穩(wěn)定的而且出錯(cuò)比較少的幾個(gè)版本組合如下,以下是已選定的構(gòu)建交叉編譯環(huán)境的工具鏈版本: BINUTILS_VERSION=2.16 GCC_VERSION=3.4.3 GCCCORE_VERSIO

10、N=3.4.3 LINUX_VERSION=2.4.21 GLIBC_VERSION=2.3.5 GLIBCTHREADS_VERSION=2.3.5我選的各個(gè)軟件的版本也大致如此,其具體如下:binutils-2.10.1()gcc-2.95.3(/gnu/gcc/gcc-2.95.3)glibc-2.2.3()glibc-linuxthreads-2.2.3()linux-2.4.21-rmk2()linux-2.4.21.tar.gz()gcc patch下載: gcc-2.95.3.-2.patchgcc-2.95.3.-no-fixinc.patchg

11、cc-2.95.3-returntype-fix.patc如果你選的glibc的版本號(hào)低于2.2,你還要下載一個(gè)叫g(shù)libc-crypt的文件,例如glibc-crypt-2.1.tar.gz。 Linux 內(nèi)核你可以從 或它的鏡像下載。Binutils、 gcc和glibc你可以從FSF的FTP站點(diǎn)/gnu/ 或它的鏡像去下載。在編譯glibc時(shí),要用到 Linux 內(nèi)核中的 include 目錄的內(nèi)核頭文件。如果你發(fā)現(xiàn)有變量沒有定義而導(dǎo)致編譯失敗,你就改變你的內(nèi)核版本號(hào)。例如我開始用linux-2.4.25+vrs2,編譯 gli

12、bc-2.2.3 時(shí)報(bào) BUS_ISA 沒定義,后來發(fā)現(xiàn)在 2.4.23 開始它的名字被改為CTL_BUS_ISA。如果你沒有完全的把握保證你改的內(nèi)核改完全了,就不要?jiǎng)觾?nèi)核,而是把你的Linux 內(nèi)核的版本號(hào)降低或升高,來適應(yīng) glibc。Gcc 的版本號(hào),推薦用 gcc-2.95 以上的。太老的版本編譯可能會(huì)出問題。Gcc-2.95.3 是一個(gè)比較穩(wěn)定的版本,也是內(nèi)核開發(fā)人員推薦用的一個(gè) gcc 版本。如果你發(fā)現(xiàn)無法編譯過去,有可能是你選用的軟件中有的加入了一些新的特性而其他所選軟件不支持的原因,就相應(yīng)降低該軟件的版本號(hào)。例如我開始用 gcc-3.3.2,發(fā)現(xiàn)編譯不過,報(bào) as、ld 等版本

13、太老,我就把 gcc 降為 2.95.3。太新的版本大多沒經(jīng)過大量的測(cè)試,建議不要選用。(二)建立工作目錄首先,我們建立幾個(gè)用來工作的目錄:在你的用戶目錄,我用的是用戶tang,因此用戶目錄為/home/tang,先建立一個(gè)項(xiàng)目目錄cross。tangtang-laptop:$ pwd/home/tangtangtang-laptop:$ mkdir cross再在這個(gè)項(xiàng)目目錄 cross 下建立三個(gè)目錄 build-tools、kernel 和 tools。build-tools-用來存放你下載的 binutils、gcc 和 glibc 的源代碼和用來編譯這些源代碼的目錄。kernel-用

14、來存放你的內(nèi)核源代碼和內(nèi)核補(bǔ)丁。tools-用來存放編譯好的交叉編譯工具和庫(kù)文件。tangtang-laptop:$ cd crosstangtang-laptop:/cross$ mkdir build-tools kernel tools執(zhí)行完后目錄結(jié)構(gòu)如下:tangtang-laptop:/cross$ ls ./build-tools kernel tools3. 輸出和環(huán)境變量我們輸出如下的環(huán)境變量方便我們編譯。tangtang-laptop:/cross$ export PRJROOT=home/tang/crosstangtang-laptop:/cross$ export TA

15、RGET=arm-linuxtangtang-laptop:/cross$ export PREFIX=$PRJROOT/toolstangtang-laptop:/cross$ export TARGET_PREFIX=$PREFIX/$TARGETtangtang-laptop:/cross$ export PATH=$PREFIX/bin:$PATH如果你不慣用環(huán)境變量的,你可以直接用絕對(duì)或相對(duì)路徑。我如果不用環(huán)境變量,一般都用絕對(duì)路徑,相對(duì)路徑有時(shí)會(huì)失敗。環(huán)境變量也可以定義在.bashrc文件中,這樣當(dāng)你logout或換了控制臺(tái)時(shí),就不用老是export這些變量了。體系結(jié)構(gòu)和你的TAE

16、GET變量的對(duì)應(yīng)如下表你可以在通過glibc下的config.sub腳本來知道,你的TARGET變量是否被支持,例如:tangtang-laptop:./glibc-2.2.3/scripts$ ./config.sub arm-linuxarm-unknown-linux-gnu在我的環(huán)境中,config.sub 在 glibc-2.2.3/scripts 目錄下。網(wǎng)上還有一些 HOWTO 可以參考,ARM 體系結(jié)構(gòu)的The GNU Toolchain for ARM Target HOWTO,PowerPC 體系結(jié)構(gòu)的Linux for PowerPC Embedded Systems H

17、OWTO等。對(duì)TARGET的選取可能有幫助。4. 建立編譯目錄為了把源碼和編譯時(shí)生成的文件分開,一般的編譯工作不在的源碼目錄中,要另建一個(gè)目錄來專門用于編譯。用以下的命令來建立編譯你下載的binutils、gcc和glibc的源代碼的目錄。roottang-laptop:/home/tang/cross/build-tools# cd $PRJROOT/build-toolsroottang-laptop:/home/tang/cross/build-tools# mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-pat

18、chbuild-binutils-編譯binutils的目錄build-boot-gcc-編譯gcc 啟動(dòng)部分的目錄build-glibc-編譯glibc的目錄build-gcc-編譯gcc 全部的目錄gcc-patch-放gcc的補(bǔ)丁的目錄gcc-2.95.3 的補(bǔ)丁有 gcc-2.95.3-2.patch、gcc-2.95.3-no-fixinc.patch 和gcc-2.95.3-returntype-fix.patch,可以從 下載到這些補(bǔ)丁。再將你下載的 binutils-2.10.1、gcc-2.95.3、glibc-2.2.3 和 glibc-linuxthreads-2.2.3

19、 的源代碼放入 build-tools 目錄中看一下你的 build-tools 目錄,有以下內(nèi)容:roottang-laptop:/home/tang/cross/build-tools# lsbinutils-2.10.1.tar.gz build-gcc gcc-patchbuild-binutils build-glibc glibc-2.2.3.tar.gzbuild-boot-gcc gcc-2.95.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz建立內(nèi)核頭文件把你從 下載的內(nèi)核源代碼放入 $PRJROOT /kernel 目錄進(jìn)入你的 kerne

20、l 目錄:roottang-laptop:/home/tang/cross/build-tools# cd $PRJROOT/kernel解開內(nèi)核源代碼tar -zxvf linux-2.4.21.tar.gz或者roottang-laptop:/home/tang/cross/kernel# tar -jxvf linux-2.4.21.tar.bz2小于 2.4.19 的內(nèi)核版本解開會(huì)生成一個(gè) linux 目錄,沒帶版本號(hào),就將其改名。roottang-laptop:/home/tang/cross/kernel# dirlinux-2.4.21 linux-2.4.21.tar.bz2給

21、 Linux 內(nèi)核打上你的補(bǔ)丁roottang-laptop:/home/tang/cross/kernel# cd linux-2.4.21roottang-laptop:/home/tang/cross/kernel/linux-2.4.21# patch -p1 < ./patch-2.4.21-rmk2編譯內(nèi)核生成頭文件roottang-laptop:/home/tang/cross/kernel/linux-2.4.21# make ARCH-arm CROSS_COMPILE=arm-linux- menconfig這時(shí)候出現(xiàn)了一個(gè)問題:感覺很頭疼,于是上新立得軟件管理器搜所

22、謂的Ncurses,搜到了之后,準(zhǔn)備安裝的時(shí)候又出現(xiàn)了一個(gè)問題。大概意思是說,ncurses依賴的文件版本是5.5但是要安裝的是5.6故不能安裝。錯(cuò)誤描述:make ARCH=arm CROSS_COMPILE=arm-linux- menuconfigNo architecture defined. You may want to use a pre-packaged config. make a5k_config, ebsa110_config, footbridge_config, etc.No architecture defined. You may want to use a pr

23、e-packaged config. make a5k_config, ebsa110_config, footbridge_config, etc.rm -f include/asm( cd include ; ln -sf asm-arm asm)make -C scripts/lxdialog allmake1: Entering directory /home/tang/cross_cmp/kernel/linux-2.4.21/scripts/lxdialog'/usr/bin/ld: cannot find -lncursescollect2: ld returned 1

24、exit status-e>> Unable to find the Ncurses libraries.>>>> You must have Ncurses installed in order>> to use 'make menuconfig'make1: * ncurses Error 1make1: Leaving directory /home/tang/cross_cmp/kernel/linux-2.4.21/scripts/lxdialog'make: * menuconfig Error 2Ncurse

25、s的作用:提供字符終端處理庫(kù),包括面板和菜單。進(jìn)行如下的幾步進(jìn)行安裝。解決辦法:(1)于是直接上網(wǎng)搜5.5的tar包直接安裝。下載地址:(/source/etch/ncurses)(2)、安裝ncursesncurses是字符終端下屏幕控制的基本庫(kù)??赡芎芏嘈麻_發(fā)的程序都不使用了,不過如果要編譯一些老程序,還經(jīng)常遇得到。安裝:./configure -without-debug #以及其它自己需要的參數(shù)makemake install(3),繼續(xù)你的make menuconfig。圖形界面出來解決完事之后你就可以用下一步了。這里用的是menuc

26、onfig,其實(shí)你也可以用 config 和 xconfig 來代替 menuconfig,但這樣用可能會(huì)沒有設(shè)置某些配置文件選項(xiàng)和沒有生成下面編譯所需的頭文件。推薦大家用 make menuconfig,這也是內(nèi)核開發(fā)人員用的最多的配置方法。配置完退出并保存,檢查一下的內(nèi)核目錄中的 include/linux/version.h 和 include/linux/autoconf.h 文件是不是生成了,這是編譯 glibc 是要用到的,version.h 和 autoconf.h 文件的存在,也說明了你生成了正確的頭文件。還要建立幾個(gè)正確的鏈接:roottang-laptop:/home/ta

27、ng/cross/kernel/linux-2.4.21# cd include/roottang-laptop:/home/tang/cross/kernel/linux-2.4.21/include# ln -s asm-arm asmroottang-laptop:/home/tang/cross/kernel/linux-2.4.21/include# cd asmroottang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# ln -s arch-epxa archroottang-laptop:/home/tang

28、/cross/kernel/linux-2.4.21/include/asm# ln -s proc-armv proc接下來為你的交叉編譯環(huán)境建立你的內(nèi)核頭文件的鏈接:roottang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# mkdir -p $TARGET_PREFIX/includeroottang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# ln -s $PRJROOT/kernel/linux-2.4.21/include/linux $TA

29、RGET_PREFIX/include/linuxroottang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# ln -s $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include/asm也可以把 Linux 內(nèi)核頭文件拷貝過來用(推薦使用這種方法,前面的ln文件路徑寫不正確的話,則有可能會(huì)出問題。)roottang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# mkdir -p

30、$TARGET_PREFIX/includeroottang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# cp -r /home/tang/cross/kernel/linux-2.4.21/include/asm $TARGET_PREFIX/includeroottang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm#cp -r $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/includ

31、e(三)建立二進(jìn)制工具(binutils)binutils是一些二進(jìn)制工具的集合,其中包含了我們常用到的as和ld。首先,我們解壓我們下載的binutils源文件。$cd $PRJROOT/build-tools$tar -xvjf binutils-2.10.1.tar.bz2然后進(jìn)入build-binutils目錄配置和編譯binutils。$cd build-binutils$./binutils-2.10.1/configure -target=$TARGET -prefix=$PREFIX-target 選項(xiàng)是指出我們生成的是 arm-linux 的工具,-prefix 是指出我們可

32、執(zhí)行文件安裝的位置。會(huì)出現(xiàn)很多 check,最后產(chǎn)生 Makefile 文件。配置要完成的時(shí)候,最后會(huì)顯示如下兩句話。creating ./config.statuscreating Makefile有了 Makefile 后,我們來編譯并安裝 binutils,命令很簡(jiǎn)單。$make$make install看一下我們 $PREFIX/bin 下的生成的文件roottang-laptop:/home/tang/cross/build-tools/build-binutils# ls $PREFIX/binarm-linux-addr2line arm-linux-gasp arm-linux

33、-objdump arm-linux-stringsarm-linux-ar arm-linux-ld arm-linux-ranlib arm-linux-striparm-linux-as arm-linux-nm arm-linux-readelfarm-linux-c+filt arm-linux-objcopy arm-linux-size我們來解釋一下上面生成的可執(zhí)行文件都是用來干什么的add2line - 將你要找的地址轉(zhuǎn)成文件和行號(hào),它要使用 debug 信息。Ar-產(chǎn)生、修改和解開一個(gè)存檔文件As-gnu 的匯編器C+filt-C+ 和 java 中有一種重載函數(shù),所用的重載

34、函數(shù)最后會(huì)被編譯轉(zhuǎn)化成匯編的標(biāo)號(hào),c+filt 就是實(shí)現(xiàn)這種反向的轉(zhuǎn)化,根據(jù)標(biāo)號(hào)得到函數(shù)名。Gasp-gnu 匯編器預(yù)編譯器。Ld-gnu 的連接器Nm-列出目標(biāo)文件的符號(hào)和對(duì)應(yīng)的地址Objcopy-將某種格式的目標(biāo)文件轉(zhuǎn)化成另外格式的目標(biāo)文件Objdump-顯示目標(biāo)文件的信息Ranlib-為一個(gè)存檔文件產(chǎn)生一個(gè)索引,并將這個(gè)索引存入存檔文件中Readelf-顯示 elf 格式的目標(biāo)文件的信息Size-顯示目標(biāo)文件各個(gè)節(jié)的大小和目標(biāo)文件的大小Strings-打印出目標(biāo)文件中可以打印的字符串,有個(gè)默認(rèn)的長(zhǎng)度,為4Strip-剝掉目標(biāo)文件的所有的符號(hào)信息(四)建立初始編譯器(bootstrap g

35、cc)首先進(jìn)入 build-tools 目錄,將下載 gcc 源代碼解壓roottang-laptop:/home/tang/cross/build-tools/build-binutils# cd $PRJROOT/build-toolsroottang-laptop:/home/tang/cross/build-tools# tar -zxvf gcc-2.95.3.tar.gz然后進(jìn)入 gcc-2.95.3 目錄給 gcc 打上補(bǔ)丁$cd gcc-2.95.3$patch -p1< ./gcc-patch/gcc-2.95.3.-2.patch$patch -p1< ./gc

36、c-patch/gcc-2.95.3.-no-fixinc.patch$patch -p1< ./gcc-patch/gcc-2.95.3-returntype-fix.patchecho timestamp > gcc/cstamp-h.in在我們編譯并安裝 gcc 前,我們先要改一個(gè)文件 $PRJROOT/gcc/config/arm/t-linux,把TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC這一行改為TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibi

37、t_libc -D_gthr_posix_h你如果沒定義 -Dinhibit,編譯時(shí)將會(huì)報(bào)如下的錯(cuò)誤././gcc-2.95.3/gcc/libgcc2.c:41: stdlib.h: No such file or directory././gcc-2.95.3/gcc/libgcc2.c:42: unistd.h: No such file or directorymake3: * libgcc2.a Error 1make2: * stmp-multilib-sub Error 2make1: * stmp-multilib Error 1make: * all-gcc Error 2如

38、果沒有定義 -D_gthr_posix_h,編譯時(shí)會(huì)報(bào)如下的錯(cuò)誤In file included from gthr-default.h:1, from ././gcc-2.95.3/gcc/gthr.h:98, from ././gcc-2.95.3/gcc/libgcc2.c:3034:././gcc-2.95.3/gcc/gthr-posix.h:37: pthread.h: No such file or directorymake3: * libgcc2.a Error 1make2: * stmp-multilib-sub Error 2make1: * stmp-multilib

39、 Error 1make: * all-gcc Error 2還有一種與-Dinhibit同等效果的方法,那就是在你配置configure時(shí)多加一個(gè)參數(shù)-with-newlib,這個(gè)選項(xiàng)不會(huì)迫使我們必須使用newlib。我們編譯了bootstrap-gcc后,仍然可以選擇任何c庫(kù)。接著就是配置boostrap gcc, 后面要用bootstrap gcc 來編譯 glibc 庫(kù)。roottang-laptop:/home/tang/cross/build-tools/gcc-2.95.3# cd .roottang-laptop:/home/tang/cross/build-tools# cd

40、 build-boot-gcc/roottang-laptop:/home/tang/cross/build-tools/build-boot-gcc# ./gcc-2.95.3/configure -target=$TARGET -prefix=$PREFIX -without-headers -enable-languages=c -disable-threads這條命令中的 -target、-prefix 和配置 binutils 的含義是相同的,-without-headers 就是指不需要頭文件,因?yàn)槭墙徊婢幾g工具,不需要本機(jī)上的頭文件。-enable-languages=c是指我們

41、的 boot-gcc 只支持 c 語言。-disable-threads 是去掉 thread 功能,這個(gè)功能需要 glibc 的支持。接著我們編譯并安裝 boot-gcc$make all-gcc$make install-gcc在make all-gcc結(jié)束的時(shí)候出現(xiàn)了一些問題。如下所示:首先出現(xiàn)了如下的問題:?jiǎn)栴}描述:asm/unistd.hError: bad instruction extern int errno'發(fā)現(xiàn)老是提示這個(gè)問題。打開unistd文件查看一下,里面只有如下幾句話。問題描述:libgcc1.S:438: asm/unistd.h: No such fil

42、e or directorymake1: * libgcc1-asm.a Error 1make1: Leaving directory /home/tang/cross/build-tools/build-boot-gcc/gcc'make: * all-gcc Error 2分析:經(jīng)過認(rèn)真分析,發(fā)現(xiàn)這個(gè)是內(nèi)核頭文件的庫(kù)文件,剛才已經(jīng)進(jìn)行鏈接了,怎么還是會(huì)出現(xiàn)問題呢?可能是在建立內(nèi)核頭文件的幾個(gè)鏈接時(shí)候不正確造成的,所以至于找不到。剛才采取的是鏈接形式:# ln-s $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/i

43、nclude/linux#ln -s $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include/asm解決辦法:現(xiàn)在使用把 Linux 內(nèi)核頭文件拷貝過來的形式:$cp -r $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include$cp -r $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include這樣make all-gcc,還是提示相同的錯(cuò)誤:asm/unist

44、d.h: No such file or directory,又仔細(xì)分析,對(duì)比,發(fā)現(xiàn),$TARGET_PREFIX/include/asm中的asm仍然是指向內(nèi)核源代碼文件 $PRJROOT/kernel/linux-2.4.21/include/中asm-arm的一個(gè)鏈接文件,并非指向當(dāng)前文件夾下asm-arm文件的鏈接文件,故此時(shí)可以重新建立鏈接文件或者將當(dāng)前文件夾$TARGET_PREFIX/include/中的asm刪除,然后將$TARGET_PREFIX/include/下的asm-arm改名為asm。這樣之后,make all-gcc了一下完事,沒有出現(xiàn)問題,繼續(xù)make inst

45、all-gcc,安裝成功??偹闼闪艘豢跉?。還剩下c庫(kù)的安裝了。我們來看看 $PREFIX/bin 里面多了哪些東西$ls $PREFIX/binarm-linux-addr2line arm-linux-gcc arm-linux-protoize arm-linux-striparm-linux-ar arm-linux-ld arm-linux-ranlib arm-linux-unprotoizearm-linux-as arm-linux-nm arm-linux-readelf cpparm-linux-c+filt arm-linux-objcopy arm-linux-size

46、gcovarm-linux-gasp arm-linux-objdump arm-linux-strings你會(huì)發(fā)現(xiàn)多了 arm-linux-gcc 、arm-linux-unprotoize、cpp 和 gcov 幾個(gè)文件。Gcc-gnu 的 C 語言編譯器Unprotoize-將 ANSI C 的源碼轉(zhuǎn)化為 K&R C 的形式,去掉函數(shù)原型中的參數(shù)類型。Cpp-gnu的 C 的預(yù)編譯器Gcov-gcc 的輔助測(cè)試工具,可以用它來分析和優(yōu)程序。使用 gcc3.2 以及 gcc3.2 以上版本時(shí),配置 boot-gcc 不能使用 -without-headers 選項(xiàng),而需要使用 glibc 的頭文件。(五)建立C庫(kù)(glibc)首先解壓 glibc-2.2.3.tar.gz 和 glibc-linuxthreads-2.2.3.tar.gz 源代碼$cd $PRJROOT/build-tools$tar -xvzf glibc-2.2.3.tar.gz$tar -xzvf glibc-linuxthreads-2.2.3.tar.gz -directory=glibc-2.2.3然后進(jìn)入 build-glibc 目錄配置 glibc$cd build-glibc$CC=arm-linux-gcc ./glibc-2.2.3/configure -host=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論