Crosstool-ng製做交叉編譯工具鏈

Crosstool-ng製做交叉編譯工具鏈

交叉編譯器能夠用現成的,好比CodeSourcery製做的交叉編譯器,也能夠本身製做,通常是用kernel+gcc+glibc+binutils的源碼包來編譯安裝,後來因爲這個太麻煩因而就有相似crosstool這樣的自動化配置工具。php

如今之因此用crosstool-ng是由於crosstool-ng是新的用來創建交叉工具鏈的工具,它是crosstool的替換者。crosstool的gcc版本只能到4.1.1,沒法編譯版本高於2.6.29的linux內核。而crosstool-ng一直保持着更新,如今最新可以創建 gcc 4.3.2版本,可用來編譯最新內核。java

編譯的系統環境是:ubuntu 10.10 + crosstool-ng 1.11.1
目標平臺:ARMv4t, arm9tdmi,s3c2440

目錄

[隱藏]

[編輯]配置ubuntu編譯環境

安裝編譯所需的包linux

 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

安裝結束之後就能夠用了。c++

若是後面出現編譯錯誤,再增長相應的包便可web

[編輯]安裝crosstool-ng

1. 首先從官方網站上下載crosstool-ng的源碼包  http://ymorin.is-a-geek.org/download/crosstool-ng/crosstool-ng-1.11.1.tar.bz2
** 記得在到http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/ 看看有沒有相應的補丁,有得話一塊兒下載下來。(#patch -p1 < 補丁文件      //若是有補丁,打補丁)
2. 將此源碼包解壓縮並編譯安裝
 tar jxvf crosstool-ng-1.11.1.tar.bz2
 cd crosstool-ng--1.11.1
 ./configure
 make
 sudo make install
3. 若是一切正常,則ct-ng命令就能夠用了

注:編譯的時候若是出現錯誤,能夠利用apt-get的方式安裝相應的包便可編程

[編輯]配置本身的交叉編譯器

crosstool-ng能夠配置各類平臺的交叉編譯器,也能夠構建符合本身實用條件的個性編譯器。下面以ARM平臺爲例,製做具備必定通用性的交叉編譯器。這裏咱們從一個現成的編譯器配置開始,用例子裏的arm-unknown-linux-gnueabi做爲配置的基礎,而後來作一個交叉編譯器。ubuntu

將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下。安全

開始編譯bash

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這樣的名稱了。

[編輯]更多的配置和提醒

用ct-ng menuconfig進入配置菜單,能夠將某些選項修改爲本身的配置,不過注意如下幾個地方:

  1. 注意其中各個Path的配置必須準確,若是找不到就很麻煩
  2. 能夠指定不一樣的下載鏡像,可是要肯定這個鏡像可用而且安全可靠
  3. 能夠不設置操做系統,也就是能夠將Target OS改爲bare-metal,這樣的交叉編譯器適合於面對硬件的裸機程序,若是不改也能夠用於裸機編程。
  4. Kernel的版本、庫的版本、gcc的版本都不建議修改,除非可以肯定一套比較完善的編譯源碼包的版本組合
  5. 配置結束後,建議存一個本身的配置文件,以防萬一和錯誤。
相關文章
相關標籤/搜索