Crosstool是由美國人Dan Kegel(畢業於加(利福尼亞)州工學院)開發的一套可以自動編譯不同匹配版本gcc和glibc,並作測試的腳本程序。Crosstool最初是爲嵌入式系統開發者創建,但也適用於主流開發者比如只是希望他們去快速編譯或需要建立程序,可運行在舊版本的Linux操作系統(例如Red Hat的6.2 )。Crosstool是一種便攜式的shell腳本。你可以使用它來建立Linux系統配置的編譯器是運行在Linux , Mac OS X操作系統, Solaris和Cygwin等。它支持的硬件平臺有:alpha, arm, i686, ia64, mips, powerpc, powerpc64, sh4, sparc, sparc64, s390, x86_64等。
在實踐之前,我們需要回答這樣的問題,爲什麼要使用交叉編譯器?主要原因是嵌入式硬件(目標機)的性能一般都無法滿足開發環境的要求,比如主頻比較低、內存少、沒有硬盤(常用FLASH作爲存儲設備)、沒有大型顯示設備、沒有全鍵盤等。交叉編器通常是採用PC(x86)作爲主機來搭建開發環境進行編譯,但編譯出的軟件能夠在特定CPU體系架構的目標設備(比如ARM設備)上運行的一套編譯工具。
下面將以具體操作步驟來講述Crosstool構建針對ARM平臺的交叉編譯器。注:該實驗是基於Fedora 10操作系統下進行,其他Linux發行版可能會有所不同。
1.準備資源文件
軟件包名稱 |
下載站點 |
crosstool-0.43.tar.gz |
http://kegel.com/crosstool/crosstool-0.43.tar.gz |
binutils-2.15.tar.bz2 |
http://ftp.gnu.org/gnu/binutils/ |
gcc-3.4.5.tar.bz2 |
http://ftp.gnu.org/gnu/gcc |
glibc-2.3.6.tar.bz2 |
http://ftp.gnu.org/gnu/glibc |
glibc-linuxthreads-2.3.6.tar.bz2 |
http://ftp.gnu.org/gnu/glibc |
linux-2.6.24.4.tar.bz2 |
http://ftp.kernel.org/pub/linux/kernel/v2.6/ |
linux-libc-headers-2.6.12.0.tar.bz2 |
http://ep09.pld-linux.org/~mmazur/linux-libc-headers/ |
[root@localhost root]# cd /mnt/hgfs/linux/
//通過VMware Tool虛擬機工具的安裝,可以實現共享,切換到共享目錄/mnt/hgfs/linux
[root@localhost linux]# ls
//顯示目錄下的所有文件及安裝包
binutils-2.15.tar.bz2 glibc-linuxthreads-2.3.6.tar.bz2
crosstool-0.43.tar.gz linux-2.6.24.4.tar.bz2
gcc-3.4.5.tar.bz2 linux-libc-headers-2.6.12.0.tar.bz2
glibc-2.3.6.tar.bz2
[root@localhost linux]# mkdir /home/user/downloads
//創建交叉編譯器源代碼存放目錄
[root@localhost linux]# mkdir /opt/crosstool
//創建交叉編譯器安裝目錄
[root@localhost linux]# tar -zxvf crosstool-0.43.tar.gz -C /home/user/
//將交叉編譯器工具解壓到/home/user目錄,這個目錄可以自己擬定。
[root@localhost linux]# cp * /home/user/downloads///將我們所需的軟件包拷貝到剛建的/home/user/downloads目錄下
[root@localhost linux]# rm -rf /home/user/downloads/crosstool-0.43.tar.gz
[root@localhost linux]# ls -ld /home/user/downloads/*
[root@localhost linux]# cd /home/user/crosstool-0.43/
//切換到交叉編譯工具目錄
[root@localhost crosstool-0.43]# pwd
//顯示當前目錄
/home/user/crosstool-0.43
[root@localhost crosstool-0.43]# cp demo-arm.sh arm.sh
//將arm.sh執行腳本模塊拷貝一份進行修改
[root@localhost crosstool-0.43]# vi arm.sh
//編輯arm.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/user/downloads #定義工具鏈源碼所存放位置 ,下載的源碼包目錄
RESULT_TOP=/opt/crosstool #定義工具鏈的安裝目錄
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++,java" #定義支持c,c++,Java
export GCC_LANGUAGES
# 創建/opt/crosstool目錄
# 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.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh –notest
#默認是執行這個兩個文件配置cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat
echo Done.
[root@localhost crosstool-0.43]# vi arm.dat
KERNELCONFIG=`pwd`/arm.config #內核的配置
TARGET=arm-softfloat-linux #編譯生成的工具鏈名稱
TARGET_CFLAGS="-O" #編譯選項
GCC_EXTRA_CONFIG="--with-float=soft" #支持software FP
GLIBC_EXTRA_CONFIG="--without-fp"
[root@localhost crosstool-0.43]# vi 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.24.4
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6
[root@localhost crosstool-0.43]# ./arm.sh
如果不修改crosstool-0.43目錄下的編譯平臺編譯器,執行arm.sh腳本,默認就會顯示TARGET平臺爲arm-unknown-linux-gun,所以我們需要編譯器類型爲TARGET=arm-softfloat-linux軟浮點類型。U-boot高版本的啓動程序支持軟浮點型。編譯U-boot以後就不會出現硬浮點類型錯誤了,解決下面問題用普通用戶執行。
[root@localhost crosstool-0.43]# su user
//切換普通用戶
[user@localhost crosstool-0.43]$ ./arm.sh
//執行安裝腳本,普通用戶創建目錄有出現權限問題,在切換到超級用戶。在執行arm.sh安裝腳本
[user@localhost crosstool-0.43]$ su
Password:******
[root@localhost crosstool-0.43]# ./arm.sh
如果沒有不出什麼意外的話,數小時後就編譯好了!
經過數小時的漫長編譯之後,會在/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin目錄下生成新的交叉編譯工具,其中包括以下內容:
[root@localhost bin]# vi /root/.bash_profile
/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux/bin
[root@localhost bin]# source /root/.bash_profile
[root@localhost bin]# ar
參考文章:http://www.top-e.org/jiaoshi/html/?391.html