使用Crosstool 0.43 在ubuntu上製作arm交叉編譯器arm-linux-gcc

來源:互聯網
上載者:User

一。 保證ubuntu 上安裝如下軟體包

Bison
flex
build-essential
patch
libncurses5-dev

查看該軟體包的依賴關係,可以看到以下內容:

$ apt-cache depends build-essential

安裝軟體包使用 $sudo apt-get install 軟體包名

二。 Crosstool

Crosstool
是一組指令碼工具集,可構建和測試不同版本的gcc和glibc,用於那些支援glibc的體繫結構。它也是一個開源項目,是http:
//kegel.com/crosstool。用Crosstool構建交叉工具鏈要比分步編譯容易得多,並且也方便許多,對於僅僅為了工作需要構建交叉
編譯工具鏈的讀者建議使用此方法。用Crosstool工具構建所需資源下所示。

表2.2 所需資源

安裝包

crosstool-0.43.tar.gz
http://kegel.com/crosstool

linux-2.6.15.4.tar.gz
ftp.kernel.org

binutils-2.16.1.tar.bz2
ftp.gnu.org

gcc-3.3.6.tar.gz
ftp.gnu.org

gcc-4.1.tar.gz
ftp.gnu.org

glibc-2.3.2.tar.gz
ftp.gnu.org

glibc-linuxthreads-2.3.2.tar.gz
ftp.gnu.org

linux-libc-headers-2.6.12.0.tar.bz2
ftp.gnu.org

gdb6.5.tar.bz2

三。crosstoo 安裝基本步驟

1.準備資源檔

首先從網上下載所需資源檔,然後將這些工具包檔案放在建立的$HOME/downloads目錄下,最後在$HOME/downloads目錄下解壓crosstool-0.43.tar.gz,命令如下:

# cd /home/zhoug/downloads(注$HOME = /home/zhoug)

# tar –xzvf crosstool-0.42.tar.gz

(

對於tar.bz2的檔案,其解壓命令

#tar -xjvf xxx.tar.bz2

)

2.建立指令檔

# cd HOME/downloads/crosstool0.43

# cp demo-arm9tdmi.sh arm.sh

# sudo gedit 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/downloads   #資源下載目錄
RESULT_TOP=/opt/crosstool             #編譯工具最終組建目錄
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"                 # 定義支援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 arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest --nounpack

echo Done

3..建立設定檔

# gedit arm9tdmi .dat

----------------------------------------------------------------------------------------------------------

KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux    # 編譯產生的工具鏈名稱
GCC_EXTRA_CONFIG="--with-cpu=arm9tdmi --enable-cxx-flags=-mcpu=arm9tdmi"
TARGET_CFLAGS="-O"

----------------------------------------------------------------------------------------------------------

# gedit gcc-4.1.0-glibc-2.3.2-tls.dat

BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.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
GDB_DIR=gdb-6.5
GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread --enable-kernel=2.4.18"

----------------------------------------------------------------------------------------------------------

4.執行指令碼

將Crosstool的指令檔和設定檔準備好之後,開始執行arm.sh指令碼來編譯交叉編譯工具。具體執行命令如下:

# cd crosstool-0.43

# ./arm.sh

5.設定環境變數

# sudo gedit /etc/bash.bashrc

export PATH=$PATH:/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin:

四。編譯中出現的錯誤

1. 我機器上的gcc 版本是gcc 4.3.3 ,進行編譯時間出錯。

   gcc 版本高或低,sudo apt-get remove gcc ,sudo apt-get install gcc-4.1 。由於ubuntu 可以安裝多種版本的gcc.我只執行

   sudo apt-get install gcc-4.1。

   安裝gcc-4.1後

   sudo rm /usr/bin/gcc            (刪除GCC,它只是個到gcc-4.3.2的軟串連檔案)
   sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc        (建立GCC到gcc-4.1的軟串連)

2. 錯誤如下:

make[2]: *** [/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version.o] 錯誤 1
bash: make[2]::找不到命令
make[2]:正在離開目錄 `/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/glibc-2.3.2/csu'
make[1]: *** [csu/subdir_lib] 錯誤 2
make[1]:正在離開目錄 `/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc

解決方案:

修改如下檔案:
gedit /crosstool0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version-info.h
"Available extensions:/n"
"/n"
vim Demo-arm.sh
在工具鏈版本後加 --notest --nounpack

3.網上介紹的其他錯誤

1)《安裝gcc後》安裝了gcc-4.1之後,重新編譯。心想這回好了吧?!不想,有出了以下錯誤:
In file included from version.c:33:
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:2:1:
missing terminating " character
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:3:1:
missing terminating " character
google後發現,原來是ubuntu將系統預設的shell設定成了dash (the Debian Almquist Shell),所以通過指令碼產生的檔案格式和bash的不一樣,導致了編譯錯誤。在使用了
ursa
的方法後問題解決。
sudo mv /bin/sh /bin/sh.old
sudo ln -sf bash /bin/sh

2)今天在編譯skyeye時又報錯
/usr/include/bits/fcntl2.h:51: 錯誤: 調用‘__open_missing_mode’,聲明有錯誤屬性:open with O_CREAT in second argument needs 3 arguments
按理說在Fedora 10中都可以編譯過的,在ubuntu下應該也沒什麼問題才對,可是偏偏出現這個問題。趕緊跟蹤,首先對比兩個版本的/usr/include/bits/fcntl2.h,發現沒有區別,那麼就是代碼的問題了。改代碼,報錯是在612行
if(!nf->writebuffer)
free(nf->writebuffer);
free(nf);
提示是open有錯,但是612行是free,注釋掉前兩行,居然誤判成了free(nf),繼續注釋掉free(nf),終於,錯誤給出來了,是在
519行的 if ((nf->fdump= open(dev->dump, FILE_FLAG)) 0)
open在調用的時候只有兩個參數,趕緊給加上個0777,代碼成了 if ((nf->fdump= open(dev->dump, FILE_FLAG,0777)) 0)
謝天謝地,終於編譯通過了。

遇到arm-linux-ar堆疊溢位的問題

主要是4.3.2編譯器的問題,改為4.1的編譯器即可

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/public/archive/2010/03/06/5352598.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.