2009年6月4日 星期四

Ubuntu 8.10 與 9.04 及 10.04 編譯 arm-linux-gcc (Crosstool-0.43)

建立交叉編譯工具鏈的主機環境:OS=Ubuntu 9.04 GCC=4.1 CPU=T7250 RAM=2G
sudo apt-get install bison flex m4 gcc-4.1 build-essential patch libncurses5-dev
mkdir /home/wayne/downloads
mkdir /home/wayne/crosstool-4.1.1
在10.04中需再安裝bison flex

先下載下列檔案,並放到$home/downloads
binutils-2.16.1.tar.bz2
glibc-2.3.2.tar.bz2
glibc-linuxthreads-2.3.2.tar.bz2
gcc-3.3.6.tar.bz2
gcc-4.1.1.tar.bz2
gdb-6.5.tar.bz2

wget http://ftp.gnu.org/gnu/binutils/binutils-2.16.1.tar.bz2
wget http://ftp.gnu.org/gnu/glibc/glibc-2.3.2.tar.bz2
wget http://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.3.2.tar.bz2
wget http://ftp.gnu.org/gnu/gcc/gcc-3.3.6/gcc-3.3.6.tar.bz2
wget http://ftp.gnu.org/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2
wget http://ftp.gnu.org/gnu/gdb/gdb-6.5.tar.bz2

由於9.04版gcc為4.3.3 編譯用此版本編譯會出錯,所以改用gcc4.1 sudo apt-get install gcc-4.1

然後是
sudo rm /usr/bin/gcc (刪除GCC,它只是個到gcc-4.3.3的軟鏈接文件)
sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc (建立GCC到gcc-4.1的連接)

如果運行
ls -la /bin/sh
看到鏈接的是 dash ,則請運行以下命令
sudo dpkg-reconfigure dash
選擇 no 以刪除 dash ,編譯完成可再運行此命令選擇 yes 以重新安裝 dash
此處如果不改好的話,編譯時會出現錯誤

修改 crosstool-0.43 目錄下 demo-arm9tdmi.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=/home/wayne/crosstool-4.1.1
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 arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest


eval `cat arm9tdmi.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest
echo Done.

其中紅字部分是需要改變的的
TARBALLS_DIR 是下載的工具原始碼的存放目錄,可事先下載原始碼存放於此(不要解壓)。RESULT_TOP 是要生成的工具鏈的存放目錄,一定要改到有寫權限的目錄,不然無法編譯
修改 crosstool-0.43 目錄下 gcc-4.1.1-glibc-2.3.2.dat 為
BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.1
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.28.10
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GDB_DIR=gdb-6.5

關於 linux-libc-headers ,引用 Aquarius 的話如下
編譯Glibc必須要有linux內核頭文件。最初人們直接使用內核源碼包中的頭文件(/usr/include目錄 下),後來由於內核開發者強烈反對這種做法,於是出現了linux-libc-headers項目,以為Linux頭文件維護一個穩定版本的API。最近 該項目已經停止發展(該項目提供的最新版本的「純淨的」頭文件版本是2.6.12.0);從2.6.18版本開始,內核開發組負責維護一份統一的、「純淨 的」內核頭文件,獲取編譯glibc所需的頭文件只需要使用命令」make headers_install」即可。

要想瞭解 Crosstool 更多的信息,可以閱讀《crosstool-howto》和《Crosstool variables》
如果不是需要很瞭解 Crosstool ,又想看中文解釋的推薦閱讀 Aquarius 的
Building arm-linux toolchain for ARM/XScale-iWMMXt

以上就是編譯交叉編譯工具所用到的源文件組合,這個組合可以成功編譯,關於那些組合可以成功編譯可以參照http://kegel.com/crosstool/crosstool-0.43/buildlogs/表格。

在終端中進入 crosstool-0.43 目錄執行
sh ./demo-arm9tdmi.sh
若是完成時會出現
+ echo Done.
Done.

註:不要以root用戶登錄進行編譯
等待40分鐘的時間編譯就會完成了,編譯完成後應該在你所設的工作目錄下的 gcc-4.1.1-glibc-2.3.2/arm-4.1.1-linux-gnu/bin 下找到 arm-4.1.1-linux-gnu-gcc

修改環境變量
修改環境變量有多種方法我們介紹兩種
(1)第一種方法:在當前用戶目錄的.bashrc中添加如下內容
$export PATH=$PATH:/home/wayne/crosstool-4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin:
(2)第二種方法:或直接修改/home/wayne/.bashrc
cd /home/wayne
vi .bashrc
添加如下內容:
PATH=$PATH:/home/wayne/crosstool-4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin:
然後
source .bashrc
執行如下命令
$ arm-9tdmi-linux-gnu-gcc -v -v
顯示
Using built-in specs.
Target: arm-9tdmi-linux-gnu
Configured with: /home/wayne/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/gcc-4.1.1/configure --target=arm-9tdmi-linux-gnu --host=i686-host_pc-linux-gnu --prefix=/home/wayne/crosstool-4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu --with-cpu=arm9tdmi --enable-cxx-flags=-mcpu=arm9tdmi --with-headers=/home/wayne/crosstool-4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/include --with-local-prefix=/home/wayne/crosstool-4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.1.1

恢復我們修改的系統配置:
恢復gcc為4.3
sudo rm /usr/bin/gcc
sudo ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
重新安裝dash
sudo dpkg-reconfigure dash
選擇 yes 以重新安裝 dash

1 則留言:

Ryan Lei 提到...

你好,我照這篇操作時,有將那六個tarballs放在~/downloads,並且不解壓縮:
user@HUA309:~/downloads$ ll

-rwxr-xr-x 1 user src 12549917 2005-06-13 05:00 binutils-2.16.1.tar.bz2
-rwxr-xr-x 1 user src 23972413 2005-05-03 23:22 gcc-3.3.6.tar.bz2
-rwxr-xr-x 1 user src 39172003 2006-05-25 10:30 gcc-4.1.1.tar.bz2
-rwxr-xr-x 1 user src 14303558 2006-06-21 14:52 gdb-6.5.tar.bz2
-rwxr-xr-x 1 user src 13377170 2003-03-02 05:55 glibc-2.3.2.tar.bz2
-rwxr-xr-x 1 user src 216310 2003-03-02 05:55 glibc-linuxthreads-2.3.2.tar.bz2

而crosstools-0.43我建立在/usr/src/crosstools-0.43

執行sh demo-arm9tdmi.sh馬上出現了:
cat: gcc-4.1.1-glibc-2.3.2-tls.dat: 沒有此一檔案或目錄

Please set BINUTILS_DIR to the bare filename of the binutils tarball or directory

看樣子script是直接找不到TARBALLS_DIR下的binutils-2.16.1壓縮檔

我檢查過權限之類的問題:
drwxr-xr-x 2 user user 4096 2009-10-03 18:12 downloads
目錄、壓縮檔盡量都是755,owner是自己(user)

請問有可能是哪裡出錯呢?抱歉這好像是Linux基礎問題而已。

另問:LINUX_DIR=linux-2.6.28.10根據uname -a查到自己的,還是照打就好?

 Ubuntu has a mechanism, that is, the installed network card (NIC) will be renamed to another name when the system is booted. Although there...