http://blog.sina.com.cn/circlewood2010
一步一步搭建mips-linux-gcc-4.4.0交叉編譯工具
一、準備工作:
工作環境:宿主機:ubuntu10.04 linux-2.6.32-24-generic i686 gcc-4.4.3
目標機:mips32
軟體包版本:binutils-2.19.1
gcc-4.4.0
glibc-2.9
linux-2.6.29.1
gmp-4.3.0
mpfr-2.4.2
glibc-2.9-libgcc_eh-1.patch
glibc-ports-2.9
工作目錄:---home
|---crosstool
|---bin//存放最終的可執行檔和lib
|---headers
|---mips
|---4.4.0
|---bin
|---……
|---binutils//對binutils編譯
|---build
|---binutils-2.19.1//源碼
|---gcc
|---build
|---gcc-4.4.0
|---glibc
|---build
|---glibc-2.9
|---linux
|---linux-2.6.29.1
|---qemu//存放模擬器
二、編譯步驟:
1、編譯binutils
lsq$:cd /home/crosstool/binutils/build EOF
lsq$:../binutils-2.19.1/configure --target=mips-linux --prefix=/home/crosstool/bin/mips/4.4.0 --disable-nls --disable-werror --disable-multilib –enable-shared
EOF
lsq$:make all-gcc && make install-gcc EOF
lsq$:make all-target-libgcc && make install-target-libgcc EOF
Done!
結果:能夠在目標檔案夾查看到產生的可執行檔。如:mips-linux-as
註:各參數意義可查看binutils的INSTALL檔案;
藍色部分是必須的,不能僅僅用“make && make install”,否則會報找不到檔案錯誤;
紅色部分是必須的,不能省去,否則在編譯glibc的時候會出現“找不到-lgcc”錯誤 .
具體原因還沒研究清楚?
2、編譯GCC--P1
首先將GMP和MPFR兩個檔案夾解壓並重新命名為gmp,mpfr後複製到GCC源檔案夾中。
Lsq$:../gcc-4.4.0/configure --target=mips-linux --prefix=/home/crosstool/bin/mips/4.4.0/ --without-headers --with-newlib --with-float=soft --with-gnu-as --with-gnu-ld --disable-nls --disable-decimal-float --disable-libgomp --disable-multilib --disable-libssp
--disable-shared --disable-threads --disable-libmudflap --disable-libstdcxx-pch --disable-libffi enable-languages=c EOF
lsq$:make && make install EOF
Done!
結果:bin檔案夾下會多了mips-linux-gcc等可執行程式
增加環境變數:export PATH=$PATH:/home/crosstool/bin/mips/4.4.0/bin 之後在終端輸入mips-linux-gcc 會提示“沒有輸入檔案”,否則則是沒有安裝成功或者環境變數沒有設定成功。
3、編譯linux核心--實際上只是複製linux核心標頭檔
這一步最好在第一次編譯完GCC之後進行,否則會提示“mips-linux-gcc命令不存在”的錯誤--雖然對結果可能最終沒什麼影響
lsq$: make ARCH=mips CROSS_COMPILE=mips-linux- INSTALL_HDR_PATH=/home/crosstool/bin/headers headers_install
EOF
Done!
這一步只是複製了linux核心標頭檔,不過對於較低版本的linux(如2.24)則需要設定好參數後編譯核心。
4、編譯GLIBC--出問題最多的一步
將glibc-ports-2.9解壓後重新命名為ports並複製到Glibc的源檔案夾中,該檔案夾主要用於針對mips架構的一些移植等。
重要:對glibc加上glibc-2.9-libgcc_eh-1.patch補丁,否則會報“無法找到-lgcc_eh”錯誤,當然也可以按如下網址對相關設定檔進行修改:http://trac.cross-lfs.org/browser/patches/glibc-2.9-libgcc_eh-1.patch?rev=dbb2738d4c11387e45faceea1a42cc60fac752f1
關於lfs的一個補丁說明,不過手動修改挺麻煩的,還可能改錯。
在編譯根目錄下建立config.cache檔案,並加入以下內容:
libc_cv_forced_unwind=yes
libc_cv_c_cleanup=yes
libc_cv_mips_tls=yes
libc_cv_gnu99_inline=yes
以增加對NPTL的支援,當然也可以不加入該檔案而在配置時加入相關的配置參數
lsq$:BUILD_CC=gcc CC=mips-linux-gcc AR=mips-linux-ar LD=mips-linux-ld RANLIB=mips-linux-ranlib ../glibc-2.9/configure --host=mips-linux target=mips-linux prefix="/home/crosstool/bin/mips/4.4.0/mips-linux" --with-headers=/home/crosstool/bin/headers/include
--with-binutils=/home/crosstool/bin/mips/4.4.0/bin --with-tls --with-__thread --enable-sim --enable-nptl --enable-add-ons --enable-kernel=2.6.29.1 --disable-profile --without-gd --without-cvs –cache-file=config.cache EOF
編譯完成後將會在prefix目錄下產生相關檔案。
註:網路上說需要修改$prefix$/lib/libc.so檔案,實際上目的只是讓ld能尋找到它需要的庫,所以一般將路徑中的檔案夾首碼去掉,只留下檔案名稱--即在當前檔案所在檔案夾尋找;而由於我在編譯時間一直使用絕對路徑,故這裡就使用本來就有的絕對路徑而不修改。
在編譯math中fpu相關檔案時會出現某個錯誤(錯誤描述居然沒記下來……),此則可加上--without-fp而避免此錯誤,當然,可能編譯器少了對浮點的支援。
這一步還可能出現各種錯誤。
5、編譯GCC-P2--所需時間最長
只要前面沒有出現錯誤或者出現錯誤後不是投機而讓其矇混編譯通過的話這一步應該不會出現錯誤。
Lsq$:../gcc-4.4.0/configure --target=mips-linux --prefix=/home/crosstool/bin/mips/4.4.0/ --with-float=soft --enable-languages=c,c++ --enable-threads=posix --enable-c99 --enable-long-long --enable-shared --enable-__cxa_atexit --enable-nls --enable-static
–with-headers=/home/crosstool/bin/headers/include EOF
Done!
註:此步必須加上核心標頭檔參數(而不是像某些網路資料上那樣沒有加),否則會報檔案找不到錯誤,如“……/linux/errno.h:找不到該檔案”。
三、工作總結
四、參考資料
1、http://hi.baidu.com/mynana/blog/item/479eb25183ec2210377abee0.html
百度部落格
2、《建立ARM Linux交叉編譯環境實踐》網路資料,作者:蘭吉爾表計(珠海)公司
3、http://hi.baidu.com/i_know_all/blog/item/e53fb2dfb299491e632798f3.html
百度部落格 《Ubuntu下建立ARM交叉編譯工具鏈》
4、http://linux.chinaunix.net/bbs/thread-1044563-1-1.html
China-Uniux論壇 《編譯arm-linux工具鏈》
5、http://womking.bokee.com/3365467.html
《編譯crosstoolchain的詳細記錄》部落格中國
6、http://trac.cross-lfs.org/browser/patches/glibc-2.9-libgcc_eh-1.patch?rev=dbb2738d4c11387e45faceea1a42cc60fac752f1
patch from “cross linux from scratch”
7、http://sourceware.org/ml/libc-ports/2007-06/msg00008.html
to solve a fp problem
8、http://home.srvee.com/space-2856-do-blog-id-455.html
《ARM Linux交叉編譯環境工具》關於libc.so等