http://www.cnblogs.com/jeffkuang/articles/3791205.html
2014
所謂交叉編譯環(huán)境,就是在普通的 PC 機(jī)編譯生成能在目標(biāo)機(jī)(如 ARM )上運(yùn)行的軟件。在 GNU 對(duì)工具鏈的定義中,整個(gè)交叉編譯工具鏈應(yīng)該是 GCC + binutils + glibc 。其中 GCC 又包括了預(yù)編譯器 cpp 、 C 編譯器 gcc 、匯編器 as 和鏈接器 ld 。
交叉編譯工具鏈的獲得方式:
( 1 )從網(wǎng)上下載已經(jīng)構(gòu)建好的交叉編譯工具鏈,比如 ARM 的交叉編譯工具鏈可以從ftp://ftp.arm.linux.org.uk/pub/linux/arm/toochain/ 下載。注意這些已經(jīng)做好了的交叉編譯工具鏈往往規(guī)定了安裝的路徑(因?yàn)樵诰幾g時(shí)就制定了路徑 --prefix ),可以查看一下 README 文檔,通常的路徑是“ /usr/local/arm/x.x.x ”,這時(shí)需要將工具包解壓到這個(gè)路徑下。
( 2 )使用 crosstool 自己構(gòu)建,下面以構(gòu)建 ARM 交叉編譯工具鏈為例,說(shuō)明構(gòu)建步驟
1. 下載 crosstool-0.43.tar.gz
【 crosstool-0.43.tar.gz 】 http://kegel.com/crosstool/crosstool-0.43.tar.gz
2. 配置 crosstool-0.43
[leo@ crosstool]$ tar zxvf crosstool-0.43.tar.gz
[leo@ crosstool]$ cd crosstool-0.43
[leo @ crosstool-0.43]$ vi demo-arm.sh
修改下面幾行,即設(shè)置 tarball 的路徑、編譯結(jié)果頂層路徑以及需要編譯的 gcc 版本。
TARBALLS_DIR=$HOME/Downloads
RESULT_TOP=$HOME/crosstool/arm
eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest
[leo @ crosstool-0.43]$ vi gcc-4.0.0-glibc-2.3.2.dat
BINUTILS_DIR=binutils-2.16.1
GCC_DIR=gcc-4.0.0
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.15.4
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GCC_CORE_DIR=gcc-3.3.6
將以上所需的 tarball 放到 $(TARBALLS_DIR) 目錄下面。
[leo @ crosstool-0.43]$ vi arm.dat
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux
TARGET_CFLAGS="-O"
[leo @ crosstool-0.43]$ ./demo-arm.sh
系統(tǒng)開始編譯, 所有使用到的文件 ( 如果沒(méi)有預(yù)先存放在 $(TARBALLS_DIR) 目錄下面 ) ,則會(huì)在編譯的時(shí)候自動(dòng)下載。編譯的時(shí)間可能需要幾個(gè)小時(shí)。
【說(shuō)明】紅色部分為修改 / 增加部分
TARBALLS_DIR :是下載的工具源碼壓縮包的存放目錄。
RESULT_TOP :是要生成的工具鏈的存放目錄,要有寫權(quán)限的目錄,不然無(wú)法編譯。
3. 所需工具源碼壓縮包的下載地址
【 binutils-2.16.1.tar.bz2 】 http://ftp.gnu.org/gnu/binutils/
【 gcc-4.0.0.tar.bz2 】 http://ftp.gnu.org/gnu/gcc/gcc-4.0.0/
【 glibc-2.3.2.tar.bz2 】 http://ftp.gnu.org/gnu/glibc/
【 linux-2.6.15.4.tar.bz2 】 http://ftp.kernel.org/pub/linux/kernel/v2.6/
【 glibc-linuxthreads-2.3.2.tar.bz2 】 http://ftp.gnu.org/gnu/glibc/
【 gcc-3.3.6.tar.bz2 】 http://ftp.gnu.org/gnu/gcc/gcc-3.3.6/
【 gdb-6.5.tar.bz2 】 http://ftp.gnu.org/gnu/gdb/
以上就是編譯交叉編譯工具所用到的源文件組合,這個(gè)組合可以成功編譯,關(guān)于那些組合可以成功編譯可以參照http://kegel.com/crosstool/crosstool-0.43/buildlogs/ 表格。
4. 在 UBUNTU 下編譯出現(xiàn)的錯(cuò)誤
( 0 )需要安裝 bison 和 flex
sudo apt-get install bison flex
( 1 )編譯過(guò)程中出現(xiàn)一個(gè)問(wèn)題,說(shuō)是 gcc 版本太舊,其實(shí)是 gcc 版本太新了,解決如下:
先查看當(dāng)前 gcc 的版本 gcc –version ,比如我當(dāng)前的 gcc 版本 gcc-4.4
sudo apt-get install gcc-3.4
sudo rm /usr/bin/gcc
ln -s /usr/bin/gcc-3.4 /usr/bin/gcc
注意編譯完成以后要恢復(fù)成原來(lái)的版本 , 如下:
sudo rm /usr/bin/gcc
ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
注意:在較新的 UBUNTU 中, sudo apt-get install gcc-3.4 會(huì)出現(xiàn) E: Couldn’t find package gcc-3.4 ,此時(shí)需要手動(dòng)到 http://packages.ubuntu.com/ 去下載較舊版本的安裝包,并自行處理包的依賴關(guān)系。
( 2 )出現(xiàn)如: build-glibc/csu/version-info.h:1:1: missing terminating " character
系統(tǒng)在編譯生成 version.o 時(shí)候發(fā)現(xiàn) version-info.h 文件有錯(cuò)誤,解決如下:
解壓 glibc-2.3.2.tar.bz2
找到 glibc-2.3.2/csu 目錄下的 Makefile 按如下修改:
文件末尾有 2 處 echo
echo "\"Compiled on a $$os $$version system" \
"on`date +%Y-%m-%d`.\\n\"" ;; \
改為:
echo "\"Compiled on a $$os $$version system" \
"on `date +%Y-%m-%d`.\\\\n\"" ;; \
echo "\"Available extensions:\\n\""; \
改為:
echo "\"Available extensions: \\\\n\"" \
保存并重新壓縮為 glibc-2.3.2.tar.bz2 覆蓋原來(lái) $(TARBALLS_DIR) 目錄下的 glibc-2.3.2.tar.bz2 ,轉(zhuǎn)到 crosstool-0.43 目錄下從新執(zhí)行。
聯(lián)系客服