用crosstool-ng建立Linux交叉編譯環境(以S3C2440(armv4t)爲例)
首先可以去crosstool-ng的主頁瞭解一下這個工具,從那裏我們可以知道他是根據crosstool寫的。
本文檔的重點參考資料:用crosstool-ng建立arm-linux交叉工具鏈
一、下載crosstool-ng,併爲使用安裝必要的軟件。
crosstool-ng的下載地址是:http://ymorin.is-a-geek.org/download/crosstool-ng/
值得注意的是,下載裏最新的crosstool-ng以後,記得在到http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/看看有沒有相應的補丁,有得話一起下載下來。
我這次使用的是1.6.1。
使用crosstool-ng必須安裝一些開發用的軟件,在ubuntu下必須安裝(使用apt):
libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk svn (2011.09.16補充) |
二、解壓、打補丁(如果有)並建立工作目錄。
crosstool-ng和crosstool不同的地方之一就是:她並不是一下載下來就可以使用了,必須先配置安裝。
將下載下來的crosstool-ng-X.Y.Z.tar.bz2解壓到你爲她準備的工作目錄(這裏假設爲${CROSSTOOLNG}),並建立安裝和編譯目錄。
mkdir crosstool-ng-X.Y.Z_build
#這次編譯新交叉編譯器的工作目錄
patch -p1 < <補丁文件> # 給crosstool-ng打補丁(如果有)
./configure --prefix=${CROSSTOOLNG}/crosstool-ng-X.Y.Z_install
#配置crosstool-ng |
三、配置本次編譯的交叉編譯工具鏈
接下來就是配置你要編譯的交叉編譯工具鏈了,在crosstool-ng已很多已經做好的默認配置(位於crosstool-ng-X.Y.Z/samples目錄下),你只要針對其進行修改就好了。對於編譯器組件部分的版本最好不要修改,因爲那個配搭應該是經過測試後的最高本版了,但內核版本可以修改。
cd ${CROSSTOOLNG}/crosstool-ng-X.Y.Z_build/
#進入編譯新交叉編譯器的工作目錄 #拷貝默認配置文件到工作目錄
mv crosstool.config .config #修改文件名 ../crosstool-ng-X.Y.Z_install/bin/ct-ng menuconfig 進入menuconfig,開始修改配置。 |
下面我只說說針對armv4t需要修改的地方,別的構架等有了板子測試再說:
1、已下載好的源碼包路徑和交叉編譯器的安裝路徑。
Paths and misc options --->
(${HOME}/development/crosstool-ng/src) Local tarballs directory 保存源碼包路徑
(${HOME}/development/x-tools/${CT_TARGET}) Prefix directory 交叉編譯器的安裝路徑
這兩個請依據你的實際情況來修改。
2、修改交叉編譯器針對的構架
Target options --->
*** Target optimisations ***
(armv4t) Architecture level
(arm9tdmi) Emit assembly for CPU
(arm920t) Tune for CPU
以上這幾個參數是如何得出的可以參考gcc的man手冊,你可以在你下載的gcc-4.3.2.tar.bz2解壓後找到,她的位置是gcc-4.3.2/gcc/doc/gcc.1。打開方式:
man ./gcc.1 |
你可以在其中找到:
......
...... |
3、關閉JAVA編譯器,避免錯誤。
我這裏用ubuntu 9.10編譯JAVA編譯器的時候會出錯,也許是host的gcj的問題,反正我不用JAVA,所以就直接關閉了。如果有兄弟知道如何修正記得通知一聲!!
C compiler --->
*** Additional supported languages: ***
[N] Java
error log:
[INFO ] ================================================================= [INFO ] Installing final compiler [EXTRA] Configuring final compiler [EXTRA] Building final compiler [ERROR] jar: internal error: [ERROR] make[4]: *** [libgcj-4.3.2.jar] Error 1 [ERROR] make[3]: *** [all-recursive] Error 1 [ERROR] make[2]: *** [all-target-libjava] Error 2 [ERROR] make[1]: *** [all] Error 2 [ERROR] Build failed in step 'Installing final compiler' [ERROR] Error happened in '/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry) [ERROR] called from '/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/build/cc/gcc.sh' at line # 350 in function 'do_cc' [ERROR] called from '/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/crosstool-NG.sh' at line # 562 in function 'main' [ERROR] Look at '/home/tekkaman/development/x-tools/arm-tekkaman-linux-gnueabi/build.log' for more info on this error. [ERROR] (elapsed: 67:10.67) [67:11] / make: *** [build] 錯誤 2 |
4、根據參考資料,禁止內核頭文件檢測(只起到節約時間的作用(不到1S的時間),不推薦禁用)
Operating System --->
5、增加編譯時的並行進程數,以增加運行效率,加快編譯。
Paths and misc options --->
*** Build behavior ***
(4) Number of parallel jobs
這個數值不宜過大,應該爲CPU數量的兩倍。由於我的CPU是雙核的,所以我填了4.
6、一些個性化的修改(可以不修改)
Toolchain options --->
*** Tuple completion and aliasing ***
(tekkaman) Tuple's vendor string
這樣產生的編譯器前綴就是:arm-tekkaman-linux-gnueabi-
C compiler --->
(crosstool-NG-${CT_VERSION}-tekkaman) gcc ID string
配置好以後保存。
最後,內核源碼的版本號修改,請直接修改crosstool-ng-1.6.1_build目錄下的.config文件,不止一處,有關的都要修改。
有:
CT_KERNEL_VERSION= CT_KERNEL_V_2_6_??_?=y CT_LIBC_GLIBC_MIN_KERNEL= |
你也可以選擇修改crosstool-ng-X.Y.Z_build/config/kernel/linux.in等文件,只是比較麻煩,但這可以徹底解決,實現在界面中增加內核版本。
四、爲加快速度,根據配置自行下載相應的軟件包。(選做)
雖然crosstool-ng發現找不到軟件包的時候會自動下載,但是比較慢。根據這次的配置情況(查看“.config”文件),我預先下載了以下的軟件包:
binutils-2.19.1.tar.bz2
glibc-2.9.tar.gz
dmalloc-5.5.2.tgz
glibc-ports-2.9.tar.bz2
mpfr-2.4.2.tar.bz2
duma_2_5_15.tar.gz
gmp-4.3.1.tar.bz2
ncurses-5.7.tar.gz
ecj-latest.jar
libelf-0.8.12.tar.gz
sstrip.c
gcc-4.3.2.tar.bz2
linux-2.6.33.1.tar.bz2
strace-4.5.19.tar.bz2
gdb-6.8.tar.bz2
ltrace_0.5.3.orig.tar.gz
下載完之後,記得將這些軟件包放在配置時指定的文件夾。
五、開始編譯。
../crosstool-ng-1.6.1_install/bin/ct-ng bluid |
我的筆記本用了大概40多分鐘編譯完成。
六、編譯好後的交叉編譯器。
編譯器位於:${你配置時確定的路徑}/x-tools/arm-tekkaman-linux-gnueabi/bin
庫文件位於:${你配置時確定的路徑}/x-tools/arm-tekkaman-linux-gnueabi/arm-tekkaman-linux-gnueabi/lib