天天看點

linux下交叉編譯工具,Linux 系統下ARM Linux交叉編譯環境crosstool工具

Linux 系統下ARM Linux交叉編譯環境的建立目前流行的有三種途徑。

一、使用别人編譯好的開發工具鍊

cross-2.95.3.tar.bz2

arm-linux-gcc-3.3.2.tar.bz2

arm-elf-tools-20030314.sh。

其中arm-elf-tools 是專門用來編譯uclinux核心的。我們常用的cross-cross-2.95.3,下載下傳cross-2.95.3.tar.bz2 解壓後放到/usr/local/arm 目錄下設定下PATH即可使用,這是最友善快捷的方式,缺點是cross-2.95.3 GCC版本是2.95.3,版本較低,不能編譯2.6版本的Linux核心和版本較高的u-boot。cross-2.95.3.tar.bz2一般是交叉編譯2.4的linux核心的,而arm-linux-gcc-3.3.2.tar.bz2一般是交叉編譯2.6版本的核心的。

二、自己動手慢慢編譯。

這個方法是最麻煩的,需要下載下傳很多源檔案,步驟多比較繁瑣,成功率不高,極其容易出錯,即使是經驗豐富程式員,自己編譯一套完整的工具鍊也是很難成功的。

三、建立交叉編譯工具的途徑是使用 crosstool-0.43或buildroot來編譯。

如果是基于gcc和glibc來制作工具鍊,則使用crosstool來編譯,如果要基于gcc和uClibc來制作工具鍊,可以使用buildroot來進行編譯。

uClibc比glibc小,在已有的接口上是相容的,更适合嵌入式系統,單uClibc沒包括glibc中的是以的接口實作。

使用crosstool工具(crosstool-0.43.tar.gz)

$ tar zxvf crosstool-0.43.tar.gz

$ cd crosstool-0.43

$ cp glibc-2.3.6-version-info.h_err.patch  crosstool-0.43/patches/glibc-2.3.6/

打開腳本demo-arm-softfloat.sh(具體使用那個sh檔案根據硬體确定)

#!/bin/sh

# This script has one line for each known working toolchain

# for this architecture.  Uncomment the one you want.

# Generated by generate-demo.pl from buildlogs/all.dats.txt

set -ex

TARBALLS_DIR=$HOME/downloads             

RESULT_TOP=/opt/crosstool                

export TARBALLS_DIR RESULT_TOP

GCC_LANGUAGES="c,c++"                   

export GCC_LANGUAGES

# Really, you should do the mkdir before running this,

# and chown /opt/crosstool to yourself so you don't need to run as root.

mkdir -p $RESULT_TOP                           

#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.1.3.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.2.2.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.2.5.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.2.2.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest

eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest

echo Done.

1、demo-arm-softfloat.sh中修改

TARBALLS_DIR=/work/tools/create_crosstools/src_gcc_glibc     

RESULT_TOP=/opt/crosstool             

2、arm-softfloat.dat

KERNELCONFIG=`pwd`/arm.config

TARGET=arm-softfloat-linux-gnu     

TARGET_CFLAGS="-O"

GCC_EXTRA_CONFIG="--with-float=soft"

GLIBC_EXTRA_CONFIG="--without-fp"

3、all.sh

PREFIX=${PREFIX-$RESULT_TOP/$TOOLCOMBO/$TARGET}

修改成

PREFIX=${PREFIX-$RESULT_TOP/$TOOLCOMBO}

其中TARGET在arm-softfloat.dat定義的

4、gcc-3.4.5-glibc-2.3.6.dat

BINUTILS_DIR=binutils-2.15

GCC_DIR=gcc-3.4.5

GLIBC_DIR=glibc-2.3.6

LINUX_DIR=linux-2.6.8 (可以修改核心版本)

LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0

GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6

GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread  --enable-kernel=2.4.18"

以上所提到的就是生成交叉編譯器所需要的壓縮包的版本。

5、進入crosstool-0.43

$ cd crosstools-0.43

$ ./demo-arm-softfloat.sh

$ arm-linux-gcc –v  

可能的錯誤:

ubuntu中預設gcc的版本是,對于crosstools 0.43而言gcc可能太新了。

解決的辦法很簡單:裝個gcc4.1,然後把/usr/bin/gcc的link由gcc4.2指向4.1即可。

sudo apt-get install gcc-4.1

ls -l /usr/bin/gcc   #你可以看看現在的gcc指向哪裡

sudo rm /usr/bin/gcc

sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc

附錄:

binutils是二進制檔案的處理工具,它主要包含了一些輔助開發工具,例如,objdump顯示反彙編碼、nm列出符号表、readelf顯示elf檔案資訊及段資訊、strip将不必要的代碼去掉以減少可執行檔案大小等。這些工具在嵌入式開發初期,尤其是在移植調試作業系統時非常有用。

gcc是編譯工具,用來編譯核心代碼的工具,使用它可以編譯彙編語言和c語言的程式,生成arm的代碼。

glibc是連結和運作庫,它的編譯需要指定編譯器為arm交叉編譯器,否則編譯出的glibc代碼将會是同時有arm和x86代碼的混合體。所有需要用到的工具都可以通過下載下傳源碼自行編譯,然後在主控端上進行安裝,就可以建立起arm的交叉編譯環境。