2016年9月20日 星期二

建立交叉編譯工具鏈的主機環境: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

先下載下列檔案,並放到$home/downloads

由於9.04gcc4.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 (
建立GCCgcc-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

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-4.1.1-linux-gnu-gcc -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

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


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