用crosstool-ng建立Linux 交叉編譯環境

http://blog.chinaunix.net/uid-20543672-id-94369.html
用crosstool-ng建立Linux交叉編譯環境(以S3C2440(armv4t)爲例)

    最近準備針對Linux內核和驅動做實驗,但是當我用從前的製作的gcc-4.1.1編譯最新的Linux內核的時候發現因爲編譯器太舊了無法編譯,所以決定在做一個新的可以使用的。早就知道crosstool-ng這個工具了,但是去年使用了以後發現編譯出的庫文件不對(我要編譯armv4的,結果編譯出了v5的),所以只留下了記錄,沒有寫文檔。這次編譯成功了,經過編譯u-boot、Linux kernel、busybox,並製作了根文件系統做測試,都沒有問題,這才決定寫一份文檔放到博客來。好的,閒話不多說,現在就是見證製作過程的時刻。

    首先可以去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建立arm-linux交叉工具鏈的介紹,最好手動安裝一下termcap

二、解壓、打補丁(如果有)並建立工作目錄。
   crosstool-ng和crosstool不同的地方之一就是:她並不是一下載下來就可以使用了,必須先配置安裝。
   將下載下來的crosstool-ng-X.Y.Z.tar.bz2解壓到你爲她準備的工作目錄(這裏假設爲${CROSSTOOLNG}),並建立安裝和編譯目錄。

mkdir crosstool-ng-X.Y.Z_build     #這次編譯新交叉編譯器的工作目錄
mkdir crosstool-ng-
X.Y.Z_install   #crosstool-ng的安裝目錄
cd crosstool-ng-
X.Y.Z              #進入解壓後的crosstool-ng目錄

patch -p1 <   <補丁文件>            # 給crosstool-ng打補丁(如果有)

./configure --prefix=${CROSSTOOLNG}/crosstool-ng-X.Y.Z_install 

                                   #配置crosstool-ng
make                               #編譯crosstool-ng
make install                       #安裝crosstool-ng


三、配置本次編譯的交叉編譯工具鏈
   接下來就是配置你要編譯的交叉編譯工具鏈了,在crosstool-ng已很多已經做好的默認配置(位於crosstool-ng-X.Y.Z/samples目錄下),你只要針對其進行修改就好了。對於編譯器組件部分的版本最好不要修改,因爲那個配搭應該是經過測試後的最高本版了,但內核版本可以修改。

cd ${CROSSTOOLNG}/crosstool-ng-X.Y.Z_build/   

#進入編譯新交叉編譯器的工作目錄 
cp ../crosstool-ng-
X.Y.Z/samples/arm-unknown-linux-gnueabi/* ./

#拷貝默認配置文件到工作目錄

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


你可以在其中找到:

......
 ARM Options
......
-mcpu=name   (
Emit assembly for CPU)
           This specifies the name of the target ARM processor. GCC uses this
           name to determine what kind of instructions it can emit when gener‐
           ating assembly code. Permissible names are: arm2, arm250, arm3,
           arm6, arm60, arm600, arm610, arm620, arm7, arm7m, arm7d, arm7dm,
           arm7di, arm7dmi, arm70, arm700, arm700i, arm710, arm710c, arm7100,
           arm7500, arm7500fe, arm7tdmi, arm7tdmi-s, arm8, strongarm, stron‐
           garm110, strongarm1100, arm8, arm810, arm9, arm9e, arm920, arm920t,
           arm922t, arm946e-s, arm966e-s, arm968e-s, arm926ej-s, arm940t,
           arm9tdmi, arm10tdmi, arm1020t, arm1026ej-s, arm10e, arm1020e,
           arm1022e, arm1136j-s, arm1136jf-s, mpcore, mpcorenovfp,
           arm1156t2-s, arm1176jz-s, arm1176jzf-s, cortex-a8, cortex-r4, cor‐
           tex-m3, xscale, iwmmxt, ep9312.

       -mtune=name   
(Tune for CPU)
           This option is very similar to the -mcpu= option, except that
           instead of specifying the actual target processor type, and hence
           restricting which instructions can be used, it specifies that GCC
           should tune the performance of the code as if the target were of
           the type specified in this option, but still choosing the instruc‐
           tions that it will generate based on the cpu specified by a -mcpu=
           option. For some ARM implementations better performance can be
           obtained by using this option.

       -march=name  
(Architecture level) 
           This specifies the name of the target ARM architecture. GCC uses
           this name to determine what kind of instructions it can emit when
           generating assembly code. This option can be used in conjunction
           with or instead of the -mcpu= option. Permissible names are:
           armv2, armv2a, armv3, armv3m, armv4, armv4t, armv5, armv5t,
           armv5te, armv6, armv6j, armv6t2, armv6z, armv6zk, armv7, armv7-a,
           armv7-r, armv7-m, iwmmxt, ep9312.

......



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  --->
 [N]     Check installed headers

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-1.6.1_install/bin/ct-ng menuconfig,這個修改又會復原,必須再次手工修改。
你也可以選擇修改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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章