用Crosstool工具构建交叉工具链

通常构建交叉工具链有3种方法。
方法一    分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方法相对比较困难,适合想深入学习构建交叉工具链的读者。如果只是想使用交叉工具链,建议使用方法二或方法三构建交叉工具链。
方法二    通过Crosstool脚本工具来实现一次编译生成交叉编译工具链,该方法相对于方法一要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。
方法三    直接通过网上(ftp.arm.kernel.org.uk)下载已经制作好的交叉编译工具链。该方法的优点不用多说,当然是简单省事,但与此同时该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是固定的没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许会在使用时出现许多莫名的错误,建议读者慎用此方法。
用Crosstool工具构建交叉工具链
      Crosstool是一组脚本工具集,可构建和测试不同版本的gcc和glibc,用于那些支持glibc的体系结构。它也是一个开源项目,下载地址是 http://kegel.com/crosstool。用Crosstool构建交叉工具链要比上述的分步编译容易得多,并且也方便许多,对于仅仅为了工作需要构建交叉编译工具链的读者建议使用此方法。用Crosstool工具构建所需资源如表2.2所示。
表2.2    所需资源
安装包
下载地址
crosstool-0.42.tar.gz
http://kegel.com/crosstool
linux-2.6.10.tar.gz
ftp.kernel.org
binutils-2.15.tar.bz2
ftp.gnu.org
gcc-3.3.6.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
1.准备资源文件
首先从网上下载所需资源文件linux-2.6.10.tar.gz、binutils-2.15.tar.bz2、gcc-3.3.6.tar.gz、glibc- 2.3.2.tar.gz、glibc-linuxthreads-2.3.2.tar.gz和linux-libc-headers-2.6.12.0.tar.bz2。然后将这些工具包文件放在新建的/home/mike/downloads目录下,最后在/home/mike目录下解压crosstool-0.42.tar.gz,命令如下:
# cd /home/mike
# tar –xvzf crosstool-0.42.tar.gz
2.建立脚本文件
接着需要建立自己的编译脚本,起名为arm.sh,为了简化编写arm.sh,寻找一个最接近的脚本文件demo-arm.sh作为模板,然后将该脚本的内容复制到arm.sh,修改arm.sh脚本,具体操作如下:
# cd crosstool-0.42
# cp demo-arm.sh arm.sh
# vi arm.sh
修改后的arm.sh脚本内容如下:
#!/bin/sh
set -ex
TARBALLS_DIR=/home/mike/downloads    # 定义工具链源码所存放位置。
RESULT_TOP=/opt/crosstool                # 定义工具链的安装目录
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"                    # 定义支持C, C++语言
export GCC_LANGUAGES
# 创建/opt/crosstool目录
mkdir -p $RESULT_TOP
# 编译工具链,该过程需要数小时完成。
eval 'cat arm.dat gcc-3.3.6-glibc-2.3.2.dat'    sh all.sh --notest
echo Done.
3.建立配置文件
在arm.sh脚本文件中需要注意arm.dat和gcc-3.3.6-glibc-2.3.2.dat两个文件,这两个文件是作为Crosstool的编译的配置文件。其中arm.dat文件内容如下,主要用于定义配置文件、定义生成编译工具链的名称以及定义编译选项等。
KERNELCONFIG='pwd'/arm.config    # 内核的配置
TARGET=arm-linux-                    # 编译生成的工具链名称
TARGET_CFLAGS="-O"                    # 编译选项
gcc-3.3.6-glibc-2.3.2.dat文件内容如下,该文件主要定义编译过程中所需要的库以及它定义的版本,如果在编译过程中发现有些库不存在时,Crosstool会自动在相关网站上下载,该工具在这点上相对比较智能,也非常有用。
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
LINUX_DIR=linux-2.6.10
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
4.执行脚本
将Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉编译工具。具体执行命令如下:
# cd crosstool-0.42
# ./arm.sh   
经过数小时的漫长编译之后,会在/opt/crosstool目录下生成新的交叉编译工具,其中包括以下内容:
arm-linux-addr2line arm-linux-g++            arm-linux-ld            arm-linux-size
arm-linux-ar            arm-linux-gcc            arm-linux-nm            arm-linux-strings
arm-linux-as            arm-linux-gcc-3.3.6 arm-linux-objcopy    arm-linux-strip
arm-linux-c++            arm-linux-gccbug    arm-linux-objdump    fix-embedded-paths
arm-linux-c++filt    arm-linux-gcov        arm-linux-ranlib
arm-linux-cpp            arm-linux-gprof        arm-linux-readelf
5.添加环境变量
然后将生成的编译工具链路径添加到环境变量PATH上去,添加的方法是在系统/etc/ bashrc文件的最后添加下面一行,如图2.2所示。

图2.2    用Vi编辑器在bashrc文件中添加环境变量
export PATH=/opt/crosstool/gcc-3.3.6-glibc-2.3.2/arm-linux/bin:$PATH   
设置完环境变量,也就意味着交叉编译工具链已经构建完成,然后就可以用2.2.1.8节中的方法进行测试刚刚建立的工具链,此处就不用再赘述。
2.3    本章小结
本章讲述的内容非常有实用价值,因为交叉编译工具链的构建是嵌入式系统开发必不可少的一部分,也是嵌入式系统开发的基础。本章首先对交叉编译工具链进行了大体的介绍,然后分别介绍了两种构建交叉编译工具链的方法:分步构建法和Crosstool工具构建法。这两种构建交叉编译工具链的方法在实际应用中非常广泛,相信读者通过学习本章的内容可以构建一套自己的交叉编译工具链。第3章将介绍嵌入式系统的启动程序——BootLoader。
2.4    常见问题
问题1:编译boot-trap gcc时出现如图2.3所示的错误,提示:crti.o: No such file: No such file or directory collect2: ld returned 1 exit status,为什么会出现这样的错误?

图2.3    gcc工具编译出错界面
参考答案:
由于在配置时没有选择--disable-shared 选项,该选项的意思是只编译静态库。默认选项为--enable-shared,而libf2c 和libiberty 不支持共享库。
问题2:Glibc里静态库和共享库有什么区别?
参考答案:
应用程序在链接静态库时,会把引用到的数据和代码放到生成的可执行文件中,程序运行时就不再需要库了。应用程序链接共享库时,连接器不会把引用到的数据和代码放到可执行文件中,而仅做一个标记,当程序运行时,系统会去加载相应的共享库。链接共享库时,可执行文件的大小会小一些,但运行时依赖于共享库。启动静态库和共享库的方法分别是在配置时用 --disable-shared和--enable-shared选项。
问题3:本地编译器与交叉编译器的作用。
参考答案:
编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器叫做本地编译器。另外,编译器也可以生成用来在其他平台上运行的目标代码,这种编译器叫做交叉编译器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值