建立交叉編譯器 for arm (binutils-2.17 gcc-3.4.6 glibc-2.3.6)

來源:互聯網
上載者:User

 

交叉編譯器建立過程 準備工作下載一下源碼包:可以到ftp://ftp.gnu.org 下載源碼包binutils-2.17.tar.gz gcc-3.4.6.tar.gz glibc-2.3.6.tar.gz glibc-linuxthreads-2.3.6.tar.gz 或者到ftp://sourceware.org/pub/下載。將源碼包放入/home/zht/cross-compiler/build-tools/目錄下。可以到http://sources.gentoo.org/viewcvs.py/gentoo/src/patchsets/下載相關源碼包的補丁檔案。將補丁檔案放入/home/zht/cross-compiler/build-tools/patch目錄中。 準備核心原始碼包:linux-2.4.27.tar.gz patch-2.4.27-vrs1 2.4.27vrs1-at91-17032005.patch在目錄/home/zht/cross-compiler/kernel目錄下準備好目標板核心源碼,並配置編譯。 1 準備核心標頭檔# cd /home/zht/cross-compiler/# mkdir -p /usr/loca/arm/arm-linux/include# cp -r kernel/linux-2.4.27/include/linux/ /usr/local/arm/arm-linux/include/# cp -r kernel/linux-2.4.27/include/asm-arm/ /usr/local/arm/arm-linux/include/asm# cp -r kernel/linux-2.4.27/include/asm-generic/ /usr/local/arm/arm-linux/include2 binutils的設定# cd build-tools/# mkdir build-binutils# tar zxvf binutils-2.17.tar.gz# cd build-binutils/# ../binutils-2.17/configure --target=arm-linux --prefix=/usr/local/arm# make# make install查看一下:# ls /usr/local/arm/bin/ 設定環境變數

#export PATH=$PATH:/usr/local/arm/bin 2 引導編譯器的設定① 為引導編譯器準備glibc標頭檔(參見2 p130)# cd cd /home/zht/cross-compiler/ build-tools/# tar zxvf glibc-2.3.6.tar.gz# tar zxvf glibc-linuxthreads-2.3.6.tar.gz --directory=glibc-2.3.6# mkdir build-glibc-headers# cd build-glibc-headers# ../glibc-2.3.6/configure --host=arm-linux --prefix="/usr" --enable-add-ons=linuxthreads --with-headers=/usr/local/arm/arm-linux/include/# make cross-compiling=yes install_root=/usr/local/arm/arm-linux/ prefix="" install-headers# touch /usr/local/arm/arm-linux/include/gnu/stubs.h# touch /usr/local/arm/arm-linux/include/bits/stdio_lim.h ② 建立引導成序gcc編譯器# cd cd /home/zht/cross-compiler/ build-tools/# tar zxvf gcc-3.4.6.tar.gz# patch -p1 -d gcc-3.4.6 < patch/gcc-3.4.6-patches-1.2/patch/33_all_pr15068-fix.patch(為什嗎?可以在網上找到原因,33_all_pr15068-fix.patch中也有說明,若不打該補丁再編譯glibc時將出錯)。# mkdir build-boot-gcc# cd build-boot-gcc#../gcc-3.4.6/configure --target=arm-linux --prefix=/usr/local/arm/ --disable-shared --with-headers=/usr/local/arm/arm-linux/include/ --with-newlib --enable-language=c# make all-gcc# make install-gcc 查看: # ls /usr/local/arm/bin 3 C連結庫glibc的設定# cd /home/zht/cross-compiler/ build-tools/# mkdir build-glibc# cd build-glibc# CC=arm-linux-gcc ../glibc-2.3.6/configure --host=arm-linux --build=i686-pc-linux --prefix="/usr" --enable-add-ons=linuxthreads --with-headers=/usr/local/arm/arm-linux/include/以下是需要的補丁檔案,詳情見附錄1,編譯glibc出現錯誤的解決辦法,或者見參考1。補丁檔案可以到http://sources.gentoo.org/viewcvs.py/gentoo/src/patchsets/下載。# patch -p0 -d glibc-2.3.6 < patch/glibc-patches/5090_all_divdi3-asm-fix.patch# patch -p1 -d glibc-2.3.6 < patch/glibc-patches/6200_all_arm-glibc-2.3.4-ioperm.patch# patch -p1 -d glibc-2.3.6 < patch/glibc-patches/6230_all_arm-glibc-2.3.6-socket-no-weak-lias.patch# patch -p1 -d glibc-2.3.6 < patch/glibc-patches/gcc_eh.patch.cross 開始編譯# make# make install_root=/usr/local/arm/arm-linux prefix="" install 配置libc.so檔案# vi /usr/local/arm/arm-linux/lib/libc.so將GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a )改為:GROUP ( libc.so.6 libc_nonshared.a ) 配置libpthread.so檔案# vi /usr/local/arm/arm-linux/lib/libpthread.so將GROUP ( /lib/libpthread.so.0 /lib/libpthread_nonshared.a )改為:GROUP ( libpthread.so.0 libpthread_nonshared.a )  4 完整編譯器的設定# cd /home/zht/cross-compiler/ build-tools/# mkdir build-gcc# cd build-gcc 如果要求gcc支援多種程式設計語言配置如下:#../gcc-3.4.6/configure --target=arm-linux --host=i686-pc-linux --prefix=/usr/local/arm --enable-threads=posix 如果要求gcc僅支援C和C++程式設計語言配置如下:#../gcc-3.4.6/configure --target=arm-linux --host=i686-pc-linux --prefix=/usr/local/arm --enable-threads=posix --enable-languages=c,c++# make all# make install 5 重複3重新編譯glibc 6 根據參考2,作如下設定

# cd /usr/local/arm/arm-linux/bin# mv as ar gcc ld nm ranlib strip /usr/local/arm/lib/gcc/arm-linux/3.4.6# for file in as ar gcc ld nm ranlib strip> do> ln –s /usr/local/arm/lib/gcc/arm-linux/3.4.6/$file .> done 7 利用建立的交叉編譯器編譯核心(編譯linux-2.4.27-vrs1) 錯誤及處理1 cc1: error: invalid option `short-load-bytes'處理:將 arch/arm/Makefile中的CFLAGS_BOOT     :=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -UarmCFLAGS          +=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float –Uarm改為:CFLAGS_BOOT    :=$(apcs-y) $(arch-y) $(tune-y) -malignment-traps -msoft-float -UarmCFLAGS         +=$(apcs-y) $(arch-y) $(tune-y) -malignment-traps -msoft-float –Uarm 2 at91_serial.c: In function `at91_register_uart':at91_serial.c:654: error: syntax error before "__FUNCTION__"at91_serial.c:691: error: syntax error before "__FUNCTION__"處理:將drivers/at91/serial/at91_serial.c中的printk(KERN_ERR __FUNCTION__ ": bad index number %d/n", idx);改為:printk(KERN_ERR "%s:bad index number %d/n",__FUNCTION__ ,idx); 將printk(KERN_ERR __FUNCTION__ ": bad port number %d/n", port);改為:printk(KERN_ERR "%s:bad port number %d/n",__FUNCTION__ ,port); 3   keyboard.c: In function `kbd_processkeycode':keyboard.c:413: error: label at end of compound statementkeyboard.c: In function `do_fn':處理如下:將drivers/char/keyboard.c 中 413行的#endif                }        }               rep = 0;out:    }  改為:#endif                }        }               rep = 0;out:        rep=rep;}  4 /home/zht/sources/mykernel/kernel2.4.27/linux-2.4.27/include/linux/sched.h:766: sorry, unimplemented: inlining failed in call to '__mmdrop': function body not availablesched.c:771: sorry, unimplemented: called from here處理如下:將 include/linux/sched.h中 line766extern inline void FASTCALL(__mmdrop(struct mm_struct *));改為:extern void FASTCALL(__mmdrop(struct mm_struct *)); 5 /home/zht/sources/mykernel/kernel2.4.27/linux-2.4.27/include/linux/blkdev.h:236: sorry, unimplemented: inlining failed in call to 'blk_get_queue': function body not availableblkpg.c:264: sorry, unimplemented: called from here/home/zht/sources/mykernel/kernel2.4.27/linux-2.4.27/include/linux/blkdev.h:236: sorry, unimplemented: inlining failed in call to 'blk_get_queue': function body not availableblkpg.c:267: sorry, unimplemented: called from here 處理如下:將include/linux/blkdev.h 中line236extern inline request_queue_t *blk_get_queue(kdev_t dev);改為:extern request_queue_t *blk_get_queue(kdev_t dev); 6 /home/zht/sources/mykernel/kernel2.4.27/linux-2.4.27/include/net/ip.h:140: sorry, unimplemented: inlining failed in call to 'ip_finish_output': function body not availableip_forward.c:165: sorry, unimplemented: called from here處理如下:將include/net/ip.h中line140的extern __inline__ int ip_finish_output(struct sk_buff *skb);改為:extern int ip_finish_output(struct sk_buff *skb);    『附錄1』建立交叉編譯器時出現的錯誤及解決辦法1編譯glibc

① /tmp/ccqiZHcQ.s: Assembler messages:/tmp/ccqiZHcQ.s:2243: Error: symbol definition loop encountered at `__divdi3_internal'/tmp/ccqiZHcQ.s:2243: Error: symbol definition loop encountered at `__udivdi3_internal'/tmp/ccqiZHcQ.s:2243: Error: symbol definition loop encountered at `__moddi3_internal'/tmp/ccqiZHcQ.s:2243: Error: symbol definition loop encountered at `__umoddi3_internal'make[2]: *** [/home/zht/cross-compiler/build-tools/build-glibc/csu/divdi3.os] Error 1到網上學找補丁5090_all_divdi3-asm-fix.patch 並打入glibc中。 ② make[2]: *** [/home/zht/cross-compiler/build-tools/build-glibc/misc/ioperm.o] Error 1make[2]: Leaving directory `/home/zht/cross-compiler/build-tools/glibc-2.3.6/misc'make[1]: *** [misc/subdir_lib] Error 2make[1]: Leaving directory `/home/zht/cross-compiler/build-tools/glibc-2.3.6'make: *** [all] Error 2到網上學找補丁6200_all_arm-glibc-2.3.4-ioperm.patch 並打入glibc中。 ③ ../sysdeps/unix/sysv/linux/bind.S: Assembler messages:../sysdeps/unix/sysv/linux/bind.S:5: Error: symbol `__bind' is already definedmake[2]: *** [/home/zht/cross-compiler/build-tools/build-glibc/socket/bind.o] Error 1make[2]: Leaving directory `/home/zht/cross-compiler/build-tools/glibc-2.3.6/socket'make[1]: *** [socket/subdir_lib] Error 2到網上學找補丁6230_all_arm-glibc-2.3.6-socket-no-weak-alias.patch 並打入glibc中。 ④/usr/local/arm/bin/../lib/gcc/arm-linux/3.4.6/../../../../arm-linux/bin/ld: cannot find -lgcc_ehcollect2: ld returned 1 exit statusmake[2]: *** [/home/zht/cross-compiler/build-tools/build-glibc/iconv/iconvconfig] Error 1make[2]: Leaving directory `/home/zht/cross-compiler/build-tools/glibc-2.3.6/iconv'make[1]: *** [iconv/others] Error 2make[1]: Leaving directory `/home/zht/cross-compiler/build-tools/glibc-2.3.6'make: *** [all] Error 2到網上學找補丁gcc_eh.patch.cross 並打入glibc中。或者見參考1   參考: 1 定製ToolChain for ARM http://blog.csdn.net/zht_sir/archive/2007/03/27/1542379.aspx2 構建嵌入式linux系統 KARIM YAGHMOUR 著

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.