建立交叉編譯器_第1頁
建立交叉編譯器_第2頁
建立交叉編譯器_第3頁
建立交叉編譯器_第4頁
建立交叉編譯器_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、一、下載源文件源代碼文件及其版本與下載地址:Binutils-2.19.tar.bz2/gnu/binutils/gcc-4.4.4.tar.bz2/gnu/gcc/gcc-4.4.4/Glibc-2.11.2.tar.bz2Glibc-ports-2.11.tar.bz2/gnu/glibc/glibc-2.11.2-gcc_fix-1.patchglibc-2.11.2-makefile_fix-1.patch/pa

2、tches/downloads/glibc/Gmp-4.2.tar.bz2/gnu/gmp/Mpfr-2.4.0.tar.bz2/gnu/mpfr/Linux-2.6.29.tar.bz2Patch-2.6.29.bz2 /pub/linux/kernel/v2.6/一般一個(gè)完整的交叉編譯器涉及到多個(gè)軟件,主要包括binutils、gcc、glibc等。其中,binutils主要生成一些輔助工具;gcc是用來生成交叉編譯器,主要生成arm-linux-gcc交叉編譯工具,而glibc主要

3、提供用戶程序所需要的一些基本函數(shù)庫。2、 建立工作目錄編譯所用主機(jī)型號(hào) FC12.i686,根據(jù)目標(biāo)板CPU選擇所有的工作目錄都在/home/Karen/cross下面建立完成,首先在/home/karen目錄下建立cross目錄 rootlocalhost karen mkdir cross進(jìn)入工作目錄:rootlocalhost root#cd /home/karen/cross 查看當(dāng)前目錄:rootlocalhost cross # pwd /home/karen/cross 創(chuàng)建工具鏈文件夾:rootlocalhost cross# mkdir embedded-toolchains

4、在建立了頂層文件夾embedded- toolchains,下面在此文件夾下建立如下幾個(gè)目錄:Ø setup-dir存放下載的壓縮包;Ø src-dir存放binutils、gcc、glibc解壓之后的源文件;Ø kernel存放內(nèi)核文件,對(duì)內(nèi)核的配置和編譯工作也在此完成;Ø build-dir編譯src-dir下面的源文件,這是GNU推薦的源文件目錄與編譯目錄分離的做法;Ø tool-chain交叉編譯工具鏈的安裝位;Ø program存放編寫程序;Ø doc說明文檔和腳本文件;下面建立目錄,并拷貝源文件。rootloca

5、lhost cross #cd embedded- toolchainsrootlocalhost embedded- toolchains #mkdir setup-dir src-dir kernel build-dir tool-chain program docrootlocalhost embedded- toolchains #cd setup-dir拷貝源文件:直接拷貝源文件到setup-dir目錄中建立編譯目錄:rootlocalhost setup-dir #cd ./build-dirrootlocalhost build -dir #mkdir build-binutil

6、s build-gcc build-glibc三、輸出環(huán)境變量輸出如下的環(huán)境變量方便我們編譯。為簡化操作過程。下面就建立shell命令腳本environment-variables:rootlocalhost build -dir #cd ./docrootlocalhost doc #mkdir scriptsrootlocalhost doc #cd scripts用編輯器vi編輯環(huán)境變量腳本envionment-variables:rootlocalhost scripts #vi envionment-variables export PRJROOT=/home/mxl/diliuzh

7、ang/embedded- toolchainsexport TARGET=arm-linuxexport PREFIX=$PRJROOT/tool-chainexport TARGET_PREFIX=$PREFIX/$TARGETexport PATH=$PREFIX/bin:$PATHQ:為什么用了source ./environment-variables才正常執(zhí)行,去掉source就沒有執(zhí)行?如果用source 執(zhí)行,不需要腳本有執(zhí)行權(quán)限,權(quán)限為664也可以,執(zhí)行命令如下:rootlocalhost scripts #Source environment-variables 說明:TA

8、RGET變量用來定義目標(biāo)板的類型,以后會(huì)根據(jù)此目標(biāo)板的類型來建立工具鏈。參看表6-1所示。目標(biāo)板的定義與主機(jī)的類型是沒有關(guān)系的,但是如果更改TARGET的值,GNU工具鏈必須重新建立一次。PREFIX變量提供了指針,指向目標(biāo)板工具程序?qū)⒈话惭b的目錄。TARGET_PREFIX變量指向與目標(biāo)板相關(guān)的頭文件和鏈接庫將被安裝的目錄。PATH變量指向二進(jìn)制文件(可執(zhí)行文件)將被安裝的目錄。如果不慣用環(huán)境變量的,可以直接用絕對(duì)或相對(duì)路徑。如果不用環(huán)境變量,一般都用絕對(duì)路徑,相對(duì)路徑有時(shí)會(huì)失敗。環(huán)境變量也可以定義在.bashrc文件中,這樣就不用老是export這些變量了。體系結(jié)構(gòu)和TAEGET變量的對(duì)應(yīng)

9、如下表6-1所示:表6-1 體系結(jié)構(gòu)和TAEGET變量的對(duì)應(yīng)體系結(jié)構(gòu)TARGET變量的值PowerPCPowerpc-linuxARMarm-linuxMIPS(big endian)mips-linuxMIPS(little endian)mipsel-linuxMIPS64mips64-linuxSuperH3sh3-linuxSuperH4sh4-linuxI386i386-linuxIa64ia64-linuxM68km68k-linuxM88km88k-linuxAlphaalpha-linuxSparcsparc-linuxSparc64sparc64-linux四、建立二進(jìn)制工具

10、(binutils)Binutils是GNU工具之一,它包括連接器、匯編器和其他用于目標(biāo)文件和檔案的工具,它是二進(jìn)制代碼的處理維護(hù)工具。安裝Binutils工具包含的程序有addr2line、ar、as、c+filt、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、strings、strip、libiberty、libbfd和libopcodes。對(duì)這些程序的簡單解釋如下。Ø addr2line 把程序地址轉(zhuǎn)換為文件名和行號(hào)。在命令行中給它一個(gè)地址和一個(gè)可執(zhí)行文件名,它就會(huì)使用這個(gè)可執(zhí)行文件的調(diào)試信息指出在給出的地址上是哪個(gè)文件以及行號(hào)

11、。Ø ar 建立、修改、提取歸檔文件。歸檔文件是包含多個(gè)文件內(nèi)容的一個(gè)大文件,其結(jié)構(gòu)保證了可以恢復(fù)原始文件內(nèi)容。Ø as 主要用來編譯GNU C編譯器gcc輸出的匯編文件,產(chǎn)生的目標(biāo)文件由連接器ld連接。Ø c+filt 連接器使用它來過濾 C+ 和 Java 符號(hào),防止重載函數(shù)沖突。Ø gprof 顯示程序調(diào)用段的各種數(shù)據(jù)。Ø ld 是連接器,它把一些目標(biāo)和歸檔文件結(jié)合在一起,重定位數(shù)據(jù),并連接符號(hào)引用。通常,建立一個(gè)新編譯程序的最后一步就是調(diào)用ld。Ø nm 列出目標(biāo)文件中的符號(hào)。Ø objcopy 把一種目標(biāo)文件中的內(nèi)

12、容復(fù)制到另一種類型的目標(biāo)文件中。Ø objdump 顯示一個(gè)或者更多目標(biāo)文件的信息。使用選項(xiàng)來控制其顯示的信息,它所顯示的信息通常只有編寫編譯工具的人才感興趣。Ø ranlib 產(chǎn)生歸檔文件索引,并將其保存到這個(gè)歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標(biāo)文件。Ø readelf 顯示elf格式可執(zhí)行文件的信息。Ø size 列出目標(biāo)文件每一段的大小以及總體的大小。默認(rèn)情況下,對(duì)于每個(gè)目標(biāo)文件或者一個(gè)歸檔文件中的每個(gè)模塊只產(chǎn)生一行輸出。Ø strings 打印某個(gè)文件的可打印字符串,這些字符串最少4個(gè)字符長,也可以使用選項(xiàng)-n設(shè)

13、置字符串的最小長度。默認(rèn)情況下,它只打印目標(biāo)文件初始化和可加載段中的可打印字符;對(duì)于其它類型的文件它打印整個(gè)文件的可打印字符。這個(gè)程序?qū)τ诹私夥俏谋疚募膬?nèi)容很有幫助。Ø strip 丟棄目標(biāo)文件中的全部或者特定符號(hào)。Ø libiberty 包含許多GNU程序都會(huì)用到的函數(shù),這些程序有g(shù)etopt、obstack、strerror、strtol和strtoul。Ø libbfd 二進(jìn)制文件描述庫。Ø libopcode 用來處理opcodes的庫,在生成一些應(yīng)用程序的時(shí)候也會(huì)用到它。Binutils工具安裝依賴于Bash、Coreutils、Diffut

14、ils、GCC、Gettext、Glibc、Grep、Make、Perl、Sed、Texinfo等工具下面將分步介紹安裝binutils-2.19.2的過程rootlocalhost script # cd $PRJROOT/src-dirrootlocalhost src-dir # tar jxvf ./setup-dir/binutils-2.19.tar.bz2rootlocalhost src-dir # cd $PRJROOT/build-dir/build-binutils創(chuàng)建Makefile:rootlocalhost src-dir # ././src-dir/binutil

15、s-2.19/config -target=$TARGET -prefix=$PREFIX在build-binutils目錄下面生成Makefile文件,然后執(zhí)行make,make install。完成后可以在$PREFIX/bin下面看到我們的新的binutil。注意:每個(gè)工具的文件名的前綴都是前面為TARGET變量設(shè)定的值。如果目標(biāo)板arm-linux,那么這些工具的文件名前綴就會(huì)是arm-linux-。這樣就可以根據(jù)目標(biāo)板類型找到正確的工具程序。五、建立內(nèi)核頭文件在這里我們使用時(shí)2.6.29的內(nèi)核版本,因?yàn)榻徊婀ぞ哝湽ぞ哝準(zhǔn)轻槍?duì)特定的處理器和操作系統(tǒng)的,因此在編譯之前就需要對(duì)linux內(nèi)

16、核進(jìn)行配制,可以通過make config或make menuconfig命令對(duì)內(nèi)核進(jìn)行配制,配制完成后,在linux源文件的目錄下就會(huì)生成一個(gè).config文件,這就是我們所需要的文件。Note: 目標(biāo)板的內(nèi)核版本是2.6.29rootlocalhost embedded- toolchains #cd kernelrootlocalhost kernel #tar jxvf ./setup-dir/linux-2.6.29.tar.bz2 rootlocalhost kernel #bunzip2 ./setup-dir/patch-2.6.29.bz2 rootlocalhost ker

17、nel #cd linux-2.6.29給Linux內(nèi)核打補(bǔ)?。簉ootlocalhost linux-2.6.29 #patch -p1 < ././setup-dir/patch-2.6.29然后就是配置內(nèi)核,第一步是修改Makefile修改 Makefile:ARCH = arm CROSS_COMPILE = arm-linux- menuconfig 接著使用make menuconfig進(jìn)入內(nèi)核配置菜單或者直接寫:# make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig注意:在配置時(shí)一定要選擇處理器的類型,比如我的目標(biāo)機(jī)使用的處理

18、器是OMAP類型的,就選TI OMAP:System Type -à ARM System Type -à (x) TI OMAP配置完退出并保存。配置完須執(zhí)行make,參數(shù)如下:rootlocalhost linux-2.6.29# make ARCH=arm CROSS_COMPILE=arm-linux- (執(zhí)行過程中有錯(cuò)誤出現(xiàn)也沒關(guān)系,主要目的是產(chǎn)生頭文件version.h和autoconf.h)執(zhí)行完檢查一下內(nèi)核目錄中的/kernel/linux-2.6.29/include/linux/version.h和autoconf.h文件是不是生成了,這是編譯glibc

19、要用到的。version.h 和 autoconf.h 文件的存在,說明你生成了正確的頭文件。接下來建立工具鏈需要的include目錄,并將內(nèi)核頭文件復(fù)制過去。rootlocalhost linux-2.6.29 #cd includerootlocalhost include #ln -s asm-arm asm可以查看一下,經(jīng)過編譯可以自動(dòng)生成。如果已經(jīng)生成鏈接,則不必重新鏈接。(2.6.29已自動(dòng)生成)rootlocalhost include #cd asmrootlocalhost asm #ln -s arch-epxa arch rootlocalhost asm #ln -s

20、proc-armv proc可以查看一下,經(jīng)過編譯可以自動(dòng)生成。如果已經(jīng)生成鏈接,則不必重新鏈接。復(fù)制頭文件到交叉編譯工具鏈的安裝目錄:rootlocalhost asm #mkdir -p $TARGET_PREFIX/includerootlocalhost asm #cp -r $PRJROOT/kernel/linux-2.6.29/include/linux $TARGET_PREFIX/includerootlocalhost asm #cp -r $PRJROOT/kernel/linux-2.6.29/include/asm-arm $TARGET_PREFIX/Include

21、/asmrootlocalhost asm#cp -r $PRJROOT/kernel/linux-2.6.29/include/asm-generic $TARGET_PREFIX/includerootlocalhost asm#cp -r $PRJROOT/kernel/linux-2.6.29/arch/arm/include/asm $TARGET_PREFIX/includerootlocalhost asm#cp -r $PRJROOT/kernel/linux-2.6.29/arch/arm/mach-at91/include/mach$TARGET_PREFIX/includ

22、e/asmNote: mach-xxx是根據(jù)目標(biāo)板所用的cpu類型來選擇的六、建立初始編譯器 (boot strap gcc)這一步的目的主要是建立arm-linux-gcc工具,注意這個(gè)gcc沒有g(shù)libc庫的支持,所以只能用于編譯內(nèi)核、BootLoader等不需要C庫支持的程序,后面創(chuàng)建C庫也要用到這個(gè)編譯器,所以創(chuàng)建它主要是為創(chuàng)建C庫做準(zhǔn)備,如果只想編譯內(nèi)核和BootLoader,那么安裝完這個(gè)就可以到此結(jié)束。安裝過程如下:rootlocalhost build-binutils #cd $PRJROOT/setup-dir重命名:rootlocalhost setup-dir #mv

23、gcc-core-4.4.4.tar.bz2 gcc-4.4.4.tar.bz2 rootlocalhost setup-dir #cd $PRJROOT/src-dirrootlocalhost src-dir #tar jxvf ./setup-dir/gcc-4.4.4.tar.bz2從 GCC-4.3起,安裝GCC將依賴于GMP-4.1以上版本和MPFR-2.3.2以上版本。如果將這兩個(gè)軟件包分別解壓到GCC源碼樹的根目錄下,并分別命名為"gmp"和"mpfr",那么GCC的編譯程序?qū)⒆詣?dòng)將兩者與GCC一起編譯。建議盡可能使用最新的GMP和MPF

24、R版本。rootlocalhost src-dir# tar jxvf ./setup-dir/mpfr-2.4.0.tar.bz2rootlocalhost src-dir# tar jxvf ./setup-dir/gmp-4.2.tar.bz2rootlocalhost src-dir# mv mpfr-2.4.0 gcc-4.4.4/mpfrrootlocalhost src-dir# mv gmp-4.2.0 gcc-4.4.4/gmp因?yàn)槭墙徊婢幾g器,還不需要目標(biāo)板的系統(tǒng)頭文件,所以需要使用 -without-headers這個(gè)選項(xiàng)。否則會(huì)有很多*.h頭文件找不到的報(bào)錯(cuò)-enabl

25、e-language=c用來告訴配置腳本,需要產(chǎn)生的編譯器支持何種語言,現(xiàn)在只需支持C語言。雖然配置為c,c+也可以的-disable-threads 是因?yàn)閠hreads需要libc的支持。-disable-decimal-float,需要libc的支持,而我們?cè)诔醪骄幾g的時(shí)候尚未生成libc,否則出現(xiàn)以下的報(bào)錯(cuò):./././gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:52:18: error: fenv.h: No such file or directory./././gcc-4.3.1/libgcc/config/libbi

26、d/bid_decimal_globals.c: In function '_dfp_test_except':./././gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: 'FE_INEXACT' undeclared (first use in this function)./././gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: (Each undeclared identifier is repor

27、ted only once./././gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: for each function it appears in.)-disable-shared,既然是第一次安裝ARM交叉編譯工具,那么本機(jī)的glibc支持的應(yīng)該是本機(jī)的編譯工具庫,而不是ARM交叉編譯工具庫。forces GCC to link its internal libraries statically,沒有這個(gè)選項(xiàng),會(huì)有 crti.o: No such file: No such file or directory

28、collect2: ld returned 1 exit status注:由于沒有arm的glibc,需要使用-disable-libmudflap -disable-libssp,禁止兩個(gè)邊界檢查使用的庫。同樣,由于第一次安裝ARM交叉編譯工具,那么支持的libc庫的頭文件也沒有,src-dir/gcc-4.4.4/gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS中添加兩個(gè)定義:-D inhibit_libc -D _gthr_posix_h原文:TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC

29、改后:TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D _gthr_posix.h編譯:rootlocalhost src-dir #cd $PRJROOT/build-dir/build-gccrootlocalhost build-gcc# ././src-dir/gcc-4.4.4/configure -target=$TARGET -prefix=$PREFIX -without-headers -enable-languages=c -disable-shared -disable-threads

30、 -disable-decimal-float -disable-libmudflap -disable-lipssprootlocalhost build-gcc# make all-gccrootlocalhost build-gcc# make install-gccrootlocalhost build-gcc# make all-target-libgccrootlocalhost build-gcc# make install-target-libgcc注:很多資料中之有前面兩項(xiàng),這只建立了gcc,沒有建立libgcc.a,這樣會(huì)在glibc的編譯中出現(xiàn)-lgcc沒有找到的錯(cuò)誤。報(bào)

31、告:/build-tools/build-glibc/libc_pic.ai586-linux-gcc-nostdlib-nostartfiles-r-o /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.map.o'-Wl,-(' /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/dl-allobjs.os /home/wei/workspace/mywork/moblin/build-tools/build-gl

32、ibc/libc_pic.a-lgcc'-Wl,-)' -Wl,-Map,/home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.mapT/workspace/wei/mywork/moblin/tools/bin/./lib/gcc/arm-linux/4.4.4/././././ram-linux/bin/ld: cannot find -lgcc在glibc的編譯中,還需要libgcc_eh.a(否則出現(xiàn)錯(cuò)誤:-lgcc_eh沒有找到bin/ld: cannot find -lgcc_eh

33、),使用了-disable-shared的選項(xiàng),將不會(huì)生成libgcc_eh.a,可以通過對(duì)libgcc.a的鏈接來實(shí)現(xiàn)。rootlocalhost build-gcc#ln -vs libgcc.a arm-linux-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'Note:arm-linux-gcc與-print-libgcc-file-name之間有一個(gè)空格運(yùn)行報(bào)告:“/workspace/wei/mywork/moblin/tools/bin/./lib/gcc/i586-linux/4.3.3/libgcc

34、_eh.a”-> “l(fā)ibgcc.a”裝完成后,查看結(jié)果:rootlocalhost build-gcc #ls $PREFIX/bin 如果arm-linux-gcc等工具已經(jīng)生成,表示boot trap gcc工具已經(jīng)安裝成功七、編譯glibc這一步是最為繁瑣的過程,目標(biāo)板必須靠它來執(zhí)行或者是開發(fā)大部分的應(yīng)用程序。glibc套件常被稱為C鏈接庫,但是glibc實(shí)際產(chǎn)生很多鏈接庫,其中之一是C鏈接庫libc。因?yàn)榍度胧较到y(tǒng)的限制,標(biāo)準(zhǔn)GNU C鏈接庫顯得太大,不適合應(yīng)用在目標(biāo)板上。所以需要尋找C鏈接庫的替代品,在這里現(xiàn)以標(biāo)準(zhǔn)GNU C為例建立工具鏈。rootlocalhost buil

35、d-gcc #cd $PRJROOT/src-dirrootlocalhost src-dir # tar jxvf ./setup-dir/glibc-2.11.2.tar.bz2rootlocalhost src-dir # tar jxvf ./setup-dir/glibc-ports-2.11.tar.bz2rootlocalhost src-dir # mv -v glibc-ports-2.11 glibc-2.11.2/portsrootlocalhost src-dir # cd glibc-2.11.2rootlocalhost glibc-2.11.2#patch -Np

36、1 -i ././setup-dir/glibc-2.11.2-gcc_fix-1.patchrootlocalhost glibc-2.11.2#patch -Np1 -i ././setup-dir/glibc-2.11.2-makefile_fix-1.patchrootlocalhost glibc-2.11.2 # cd $PRJROOT/build-dir/build-glibcrootlocalhost build-glibc # CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib ././src-dir/glibc-

37、2.11.2/configure -host=arm-linux -prefix=$PREFIX/$TARGET -with-tls -disable-profile -enable-add-ons -with-headers=$PREFIX/$TARGET/includelibc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_arm_tls=yesrootlocalhost build-glibc # makerootlocalhost build-glibc # make install注:以上完成后,請(qǐng)查看一下$TARGET_PRE

38、FIX/lib目錄下的文件libc.so,看看GROUP的內(nèi)容是否指定到可以用于交叉編譯的庫,如果不是請(qǐng)修改,如下。libc.so 文件(所在目錄是$TARGET_PREFIX/lib),將GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a)改為GROUP ( libc.so.6 libc_nonshared.a)如果編譯出錯(cuò)1. configure:error:forced unwind support is required在configure中增加參數(shù)libc_cv_forced_unwin=yes2.error:the compiler must support C cleanup handlin在configure中增加參數(shù)libc_cv_c_cleanup=yes這樣連接程序 l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論