來自:http://wiki.ubuntu.org.cn/Crosstool-ng%E5%88%B6%E4%BD%9C%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91%E5%B7%A5%E5%85%B7%E9%93%BE
交叉編譯器可以用現成的,比如CodeSourcery制作的交叉編譯器,也可以自己制作,一般是用kernel+gcc+glibc+binutils的源碼包來編譯安裝,後來由于這個太麻煩于是就有類似crosstool這樣的自動化配置工具。
現在之是以用crosstool-ng是因為crosstool-ng是新的用來建立交叉工具鍊的工具,它是crosstool的替換者。crosstool的gcc版本隻能到4.1.1,無法編譯版本高于2.6.29的linux核心。而crosstool-ng一直保持着更新,現在最新能夠建立 gcc 4.3.2版本,可用來編譯最新核心。
關于crosstool-ng詳細的資料可以參考官方網站:http://crosstool-ng.org/
以及另外一位牛人寫的資料:crosstool-ng詳解。
- 編譯的系統環境是:ubuntu 10.10 + crosstool-ng 1.11.1
- 目标平台:ARMv4t, arm9tdmi,s3c2440
- 在這裡,我對以下各選項稍作修改
- 注意其中各個Path的配置必須準确,如果找不到就很麻煩
- 可以指定不同的下載下傳鏡像,但是要确定這個鏡像可用并且安全可靠
- 可以不設定作業系統,也就是可以将Target OS改成bare-metal,這樣的交叉編譯器适合于面對硬體的裸機程式,如果不改也可以用于裸機程式設計。
- Kernel的版本、庫的版本、gcc的版本都不建議修改,除非能夠确定一套比較完善的編譯源碼包的版本組合
- 配置結束後,建議存一個自己的配置檔案,以防萬一和錯誤。
配置ubuntu編譯環境
安裝編譯所需的包sudo apt-get install sed bash cut dpkg-dev bison flex patch texinfo automake m4 libtool stat cvs websvn tar gzip bzip2 lzma readlink libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk -y
安裝結束以後就可以用了。
如果後面出現編譯錯誤,再增加相應的包即可
[編輯]安裝crosstool-ng
- 1. 首先從官方網站上下載下傳crosstool-ng的源碼包 http://ymorin.is-a-geek.org/download/crosstool-ng/crosstool-ng-1.11.1.tar.bz2 2. 将此源碼包解壓縮并編譯安裝
tar jxvf crosstool-ng-1.11.1.tar.bz2
cd crosstool-ng--1.11.1
./configure
make
sudo make install
- 3. 如果一切正常,則ct-ng指令就可以用了
[編輯]配置自己的交叉編譯器
crosstool-ng可以配置各種平台的交叉編譯器,也可以建構符合自己實用條件的個性編譯器。下面以ARM平台為例,制作具有一定通用性的交叉編譯器。這裡我們從一個現成的編譯器配置開始,用例子裡的arm-unknown-linux-gnueabi作為配置的基礎,然後來做一個交叉編譯器。- 将crosstool-ng源碼包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷貝到源碼包主目錄下,在源碼包主目錄下執行
cp samples/arm-unknown-linux-gnueabi/crosstool.config .config
- 然後執行:
ct-ng menuconfig
- 進入配置菜單,與linux核心很類似
Paths and misc options --->
......
(${HOME}/src) Local tarballs directory # 指定制作編譯器所需要的源碼包的下載下傳存放,可以修改成任意位置,請注意權限。現在指定到~/src下。
......
(/opt/${CT_TARGET}) Prefix directory # 制作好的編譯器所放置的目錄
Target options --->
Target Architecture (arm) ---> # 注意看這項是不是ARM平台
......
Floating point: (software) ---> # 對于很多ARM架構CPU來說是不支援硬浮點運算的,是以選擇軟體方式有更好的相容性
......
[*] Use EABI # 是否實用EABI方式,對某些指令采用異常的方式來處理(如除法指令),建議選中
Toolchain options --->
.....
(tonghuix) Tuple's vendor string # 這裡可以修改成你自己的個性化名稱,最後會生成形如arm-yourname-linux-gnueabi這樣的編譯器字首
- 修改好以後就可以開始編譯了。
[編輯]自動下載下傳和編譯
下面就可以開始編譯了,預設情況下,源碼包會從網絡下載下傳,會占用比較大的帶寬,下載下傳後總大小在200MB左右,下載下傳好會放到 ~/src下。
開始編譯
ct-ng build
經過大概3個小時的下載下傳(2M ADSL小水管)和90分鐘的編譯過程,在/opt/下生成了arm-tonghuix-linux-gnueabi目錄 - 注:也可以提前下載下傳好,放到~/src下,但請注意下載下傳的檔案名必須一緻,否則會重新下載下傳,下面是利用arm-unkown-linux-gnueabi模闆生成交叉編譯器所需要的源碼檔案清單
binutils-2.19.1.tar.bz2
dmalloc-5.5.2.tgz
duma_2_5_15.tar.gz
ecj-latest.jar
expat-2.0.1.tar.gz
gcc-4.3.2.tar.bz2
gdb-6.8.tar.bz2
glibc-2.9.tar.bz2
glibc-ports-2.9.tar.bz2
gmp-4.3.2.tar.bz2
libelf-0.8.13.tar.gz
linux-2.6.33.12.tar.bz2
ltrace_0.5.3.orig.tar.gz
mpfr-2.4.2.tar.bz2
ncurses-5.7.tar.gz
strace-4.5.19.tar.bz2
[編輯]安裝交叉編譯器和測試
[編輯]安裝交叉編譯器
剛制作好的交叉編譯器其實就可以用了,但是還有些許不友善之處,我們可以進入到生成好的交叉編譯器的目錄cd /opt/arm-tonghuix-linux-gnueabi/bin
下面執行 ./arm-tonghuix-linux-gnueabi-gcc -v
應該可以看到如下這樣的輸出資訊 Target: arm-tonghuix-linux-gnueabi
Configured with: /home/tonghuix/crosstool-ng-1.11.1/.build/src/gcc-4.3.2/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc
inux-gnu --target=arm-tonghuix-linux-gnueabi --prefix=/opt/arm-tonghuix-linux-gnueabi --with-sysroot=/opt/arm-tonghuix-linux-gnueabi-
arm-tonghuix-linux-gnueabi/sysroot --enable-languages=c,c++,fortran,java --disable-multilib --with-float=soft --with-pkgversion=crosstool-
NG-1.11.1 --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with-gmp=/home/tonghuix
/crosstool-ng-1.11.1/.build/arm-tonghuix-linux-gnueabi/build/static --with-mpfr=/home/tonghuix/crosstool-ng-1.11.1/.build/arm-tonghuix-
linux-gnueabi/build/static --enable-threads=posix --enable-target-optspace --with-local-prefix=/opt/arm-tonghuix-linux-gnueabi-
arm-tonghuix-linux-gnueabi/sysroot --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.3.2 (crosstool-NG-1.11.1)
這樣就表明我們的交叉編譯器,制作成功了。
下面把交叉編譯器所在的目錄添加到系統PATH變量中,修改~/.bashrc檔案,在其中添加:
export PATH=$PATH:/opt/arm-tonghuix-linux-gnueabi/bin
為了使得這個PATH生效,我們可以執行一下~/.bashrc檔案 source ~/.bashrc
這樣我們就可以在指令行下直接使用arm-tonghuix-linux-gnueabi-gcc這樣的指令了! [編輯]标準化安裝交叉編譯器
我們在使用交叉編譯器的時候一般是采用arm-tonghuix-linux-gnueabi這樣的指令的,但是很多标準Makefile需要實用标準的交叉編譯器的名稱,一般這個名稱是arm-linux-gcc這樣的。cd /opt/arm-tonghuix-linux-gnueabi/bin/
那麼我們在生成交叉編譯器的目錄下寫一個link.sh腳本,建立一些軟連結。
>link.sh
#!/bin/sh
PREFIX=arm-tonghuix-linux-gnueabi-
AFTFIX=arm-linux-
ln -s ${PREFIX}gcc ${AFTFIX}gcc
ln -s ${PREFIX}addr2line ${AFTFIX}addr2line
ln -s ${PREFIX}gdbtui ${AFTFIX}gdbtui
ln -s ${PREFIX}ar ${AFTFIX}ar
ln -s ${PREFIX}as ${AFTFIX}as
ln -s ${PREFIX}c++ ${AFTFIX}c++
ln -s ${PREFIX}c++filt ${AFTFIX}c++filt
ln -s ${PREFIX}cpp ${AFTFIX}cpp
ln -s ${PREFIX}g++ ${AFTFIX}g++
ln -s ${PREFIX}gccbug ${AFTFIX}gccbug
ln -s ${PREFIX}gcj ${AFTFIX}gcj
ln -s ${PREFIX}gcov ${AFTFIX}gcov
ln -s ${PREFIX}gdb ${AFTFIX}gdb
ln -s ${PREFIX}gfortran ${AFTFIX}gfortran
ln -s ${PREFIX}gprof ${AFTFIX}gprof
ln -s ${PREFIX}jcf-dump ${AFTFIX}jcf-dump
ln -s ${PREFIX}ld ${AFTFIX}ld
ln -s ${PREFIX}ldd ${AFTFIX}ldd
ln -s ${PREFIX}nm ${AFTFIX}nm
ln -s ${PREFIX}objcopy ${AFTFIX}objcopy
ln -s ${PREFIX}objdump ${AFTFIX}objdump
ln -s ${PREFIX}populate ${AFTFIX}populate
ln -s ${PREFIX}ranlib ${AFTFIX}ranlib
ln -s ${PREFIX}readelf ${AFTFIX}readelf
ln -s ${PREFIX}run ${AFTFIX}run
ln -s ${PREFIX}size ${AFTFIX}size
ln -s ${PREFIX}strings ${AFTFIX}strings
ln -s ${PREFIX}strip ${AFTFIX}strip
寫完這個link.sh檔案以後,我們可以執行一下 sh link.sh
這樣我們就得到了整個使用标準名稱的交叉編譯工具鍊,可以在makefile中使用類似arm-linux-gcc這樣的名稱了。