分类: 嵌入式
2009-12-17 18:44:06
软件环境
U-Boot 1.1.4,
硬件环境
虚拟机
关于虚拟机的安装使用,这里就不介绍了。使用很方便,网上也有大量的资料。大家可自行查阅。我们使用的是5.5.1版本,当然,你也可以使用最新的版本。
建立交叉编译工具链。
交叉编译工具链就是为了在一个平台体系结构下(如X86 PC机)能编译,链接,处理和调试另一个平台体系结构下(如ARM)的程序,使得编译生成的程序能够在另一平台下运行。
Linux使用的工具链软件是:Binutils,gcc,glibc,gdb。
其中binutils是二进制程序处理工具。gcc是编译器。glibc是应用程序编程的函数库文件软件包。gdb是调试工具。
对交叉编译工具链的编译是很麻烦和琐碎的一件事,如果自己一个一个编译,很可能会遇到各种各样的麻烦。幸好有人做了一套脚本程序,可以很方便的生成你所需要的交叉编译工具链。我们使用的脚本就是crosstool,关于详细内容可以访问,可以从该网站下载到它的脚本,补丁和文档。
本文以i686平台,虚拟机vmware5.5.1,redhat9.0来建立arm交叉编译工具链。
我们采用crosstool0.42来作为我们编译交叉编译工具链的脚本。详细的用法说明请阅读网站上的文档crosstool-how to 。
[zzl@localhost] tar -xzvf crosstool-0.42.tar.gz
[zzl@localhost]cd crosstool-0.42
我们可以看到目录下有很多.sh脚本和.dat配置文件。每一个支持的CPU都有它所相应的脚本,如我们选用demo-arm-softfloat.sh 就是建立目标为支持软浮点的arm的交叉编译工具链。其中需要我们记住的三个重要的变量:
RESULT_TOP=/opt/crosstool
GCC_LANGUAGES="c,c++"
第一行指明我们放置源代码软件包的目录,我的主目录是/home/zzl。第二行指明我们生成的交叉编译工具链在/opt/crosstool下。第三行表示,我们的交叉编译工具链支持c,c++语言。
我们需要如下压缩包:
gcc-3.4.1.tar.gzglibc-2.3.3.tar.gz linux-2.6.17
binutils-2.15.tar.gzglibc-linuxthreads-2.3.3.tar.gz
所以,你的首要任务是下载这些源代码软件包,并将它们放在/home/zzl/downloads下面,保证这些包的所有者为当前用户而不是根用户。
由于我们以后的内核版本为2.6.17,所以我们还需要下载linux2.6.17的内核包,并放在/home/zzl/downloads/下。
我们选择的配置是:demo-arm-softfloat.sh,其内容具体如下:
set -ex
TARBALLS_DIR=$HOME/downloads
RESULT_TOP=/opt/crosstool
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
# Build the toolchain.
#eval `cat arm-softfloat.dat gcc-3.3.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.4.0-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.4.1-glibc-20040827.dat`
echo Done.
从这一行eval `cat arm-softfloat.dat gcc-3.4.1-glibc-2.3.3.dat` sh all.sh --notest
可以看出,我们的gcc版本采用3.4.1,glibc版本采用2.3.3。
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.1
GLIBC_DIR=glibc-2.3.3
LINUX_DIR=linux-2.6.8
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.3
由于我们采用的是Linux-2.6.17的内核包,所以这里要将linux-2.6.8改成linux-2.6.17。否则,脚本执行解压缩时,找不到linux源代码包。
建立我们的目标生成目录
[zzl@localhost]sudo mkdir /opt/crosstool
[zzl@localhost]sudo chown zzl /opt/crosstool
执行我们的配置文件arm-softfloat.sh
[zzl@localhost]sh demo-arm-softfloat.sh
如果一切顺利的话,经过一段时间的等待,得到一个新目录:(如果不顺利且始终找不到错误原因的话,我建议你重新安装redhat9.0的操作系统,然后按照先前步骤进行。:))
/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu
交叉编译工具就在该目录的bin/下
[zzl@localhost]ls –l /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin
总用量 29184
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rwxrwxr-x
我们可以看出,交叉编译的所有工具都在这里。
将这个路径加进PATH变量中:
[zzl@localhost]export PATH=$PATH :/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin
如果每次都要输入上面的shell命令,的确是比较烦人的事情。我们可以在linux启动脚本中添加该语句。从而避免每次开机后重新输入。我是在启动脚本/etc/profile中添加了环境变量。
找到这一行export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE
在其上面一行添加:
PATH=$PATH :/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin
今后我们编译程序的时候,就用arm-softfloat-linux-gnu-gcc 来编译我们的程序。
当然,应用程序的调试是开发过程中必不可少的环节之一。Linux下的GNU的调试器即是GDB。所以我们有了这个交叉编译工具链之后,可以用它来编译gdb和gdbserver。如果你暂时不需要GDB的话,也可以先略过这一步。