华清远见<;嵌入式Linux 系统开发班>培训教材
“黑经典”系列之《嵌入式Linux 系统开发技术详解——基于ARM 》
制作交叉编译器
5.1 工具链软件
Linux软件从一开始就使用GNU的工具链。这些GNU的工具和软件都是开放源码的,可以免费下载源码编译。但是并不能以为任何一个版本拿来都能用,各种软件包存在版本匹配问题,并且不同版本都有一
些补丁。
一套完善的工具链对于嵌入式Linux开发非常重要。发行版的Linux都会包含一整套工具链。工具链的维护和升级是Linux公司(特别是嵌入式Linux公司)非常重要的一项工作。
5.1.1 相关软件工程
GNU的工具链源码包可以从GNU网站或者镜像下载。这个站点有很多GNU软件,其中Linux使用的工具链软件是:BINTUTILS、GCC、GLIBC和GDB。
通过这些软件包,可以生成gcc、g++、ar、as、ld等编译链接工具,还可以生成glibc 库和gdb调试器。这些编程工具的使用在第3章有详细说明。对于交叉开发的工具链来说,在文件名字上加了一个前缀,用来区别本地的工具链。例如:arm-linux-gcc,除了体系结构相关的编译选项以外,它的使用方法与Linux主机上的GCC相同。所以Linux编程技术对于嵌入式Linux同样适用。
交叉开发工具链就是为了编译、链接、处理和调试跨平台体系结构的程序代码。在X86的Linux主机上,除了编译生成ARM MIPS PowerPC等体系结构的程序,还可以为X86不同版本的Linux开发程序。例如:为了维护不同版本的X86目标机,可以在Redhat Linux 9的主机上通过交叉编译的方式开发。
下面介绍一下这些软件工程的一些特点。
BINUTILS是二进制程序处理工具,包括连接器、汇编器等目标程序处理的工具。
GCC(GNU Compiler Collection)是编译器,不但能够支持C/C++语言的编译,而且能够支持FORTRAN JA V A ADA等编程语言。不过,一般不需要配置其他语言的选项,也可以避免编译其他语言功能而导致的错误。对于C/C++语言的完整支持,需要支持glibc库。
GLIBC是应用程序编程的函数库软件包,可以编译生成静态库和共享库。完整的GCC 需要支持glibc。
GDB是调试工具,可以读取可执行程序中的符号表,对程序进行源码调试。
5.1.2 软件版本的匹配
1.Crosstool
Crosstool软件实际上是一套脚本,用于编译和测试大多数体系结构的各种GCC和glibc 的版本组合。当然,前提是glibc能够支持这些体系结构,它还为工具链源码包提供了补丁。从Crosstool网站上,可以下载到这些编译脚本、补丁和文档。
Crosstool包含了体系结构和gcc、glibc各种组合配置的最小补丁。Crosstool测试支持范围如表5.1所示。
表5.1 crosstool测试支持范围
华清远见<;嵌入式Linux系统开发班>培训教材
>培训教材 处理器体系结构
alpha, arm, i686, ia64, mips, powerpc, powerpc64,  sh4, sparc, sparc64, s390, x86_64 gcc 版本
gcc-2.95.3 ... gcc-4.0.0 glibc 版本 glibc-2.1.3 ... glibc-2.3.5
crosstool 的新
版本会不断扩大测试范围。不妨下载crosstool-0.38版本,看看软件中大堆的脚本和补丁。 顶层目录下有很多*.sh 脚本和*.dat 配置文件,这是对于各种体系结构和工具版本进行编译测试的脚本。例如:all.sh 、demo-arm.sh 、arm.dat 、gcc-4.1-20050709-glibc-2.3.2-hdrs-2.6.11.2.dat 等。
因为文件确实太多,我们就不一一分析这些脚本了,只把几个目录归纳说明,如表5.2所列。  表5.2
嵌入式系统开发是什么crosstool 目录说明
LFS 最大的优点是可以按照自己的喜好和需要定制自己的系统。它可以帮助人们了解Linux 系统从头到脚到底是怎么工作的,打造一个LFS 系统的过程,把Linux 内部各个部分如何协调工作以及互相的依赖关系都展示出来。
LFS 第2个优点是可以从更大的程度上控制开发者自己的系统,而不依赖于别人打造的工具。开发者成为了Linux 系统每个部分的操纵者,比如目录的分配和起动脚本,开发者还可以了解每一个程序是做什么的,装在哪里,如何安装。
LFS 第3个优点是你可以建立一个很小的Linux 系统。在安装一般的Linux 发行版的时候,最后需要较大的硬盘空间,其中安装了一些可能并不需要的程序。可以建立一个小体积的嵌入式LFS 系统,成功地把一个系统缩减到了8M ,并且可以支持Apache 网络服务器。 进一步的简化可以把体积压缩到5M 以下。
LFS 第4个优点是系统安全性。由于整个系统都是自己定制的,可以在编译系统源码的时候加进任何一个想要的安全补丁,就不用去等别人打过补丁编译好的二进制包了。
这样的优点举不胜举,这只是其中比较突出的特点。随着LFS 经验逐渐增加,你会在自己身上发现知识所带来的力量。
LFS工程又分成几个项目,每个项目的内容如表5.3所示。其中LFS是最基本的文档,其他项目的文档或者软件是进一步开发的工具。对于嵌入式Linux系统开发来说,LFS和CLFS 都是很好的文档。
表5.3 LFS文档项目
利用这个工具链从源码编译Linux系统。
LFS文档由Matthew Burgess编写维护,其他的项目有更多的人参与。
3.常用版本
Binutils、GCC和glibc的版本匹配是个烦。应该说,越新的版本功能越强大,但是最新版本有可能存在BUG,这就需要不断地测试修正。
对于GCC的版本,2.95.x曾经统治了Linux 2.4内核时代,它表现得极为稳定。现在GCC2.95.3版本已经过时了,Linux 2.6内核需要更高的工具链版本支持。Linux 2.6内核最好使用GCC 3.3以上版本。
对于glibc版本,还要跟Linux内核的版本号匹配。在编译glibc时,要用到Linux内核头文件,在内核源码的include目录下。如果发现有变量没有定义而导致编译失败,就改变内核版本号。如果没有完全的把握保证内核修改完全了,就不要动内核,而应该把Linux内核的版本号降低或升高,以适应glibc版本。如果选择的glibc的版本号低于2.2,还要下载一个glibc-crypt的软件包,例如glibc-crypt-2.。解压到glibc源码树中。
华清远见<;嵌入式Linux系统开发班>培训教材
对于binutils版本,可以尽量使用新的版本,很多工具是辅助GCC编译的功能,问题相对较少。
2.4内核和2.6内核的工具链版本的基本组合见表5.4,这些是在ARM平台上测试过的。新的处理器或者体系结构都要求使用更高的版本才能够支持。
表5.4 ARMV4T平台工具链常用版本
工具链版本Linux 2.4.x Linux 2.6.x
binutils    2.14    2.14
gcc    2.95.3    3.3.2
glibc    2.2.5    2.2.5
glibc-threads    2.2.5    2.2.5
gdb    5.3    6.0
5.1.3 工具链制作流程
独立的,相互存在
glibc需要对应体系结构的GCC
Bootstrap compiler),用来编译
图5.1 交叉工具链编译流程图
①做好准备工作。下载工具源码包和补丁,准备内核头文件,创建工作目录等。
②编译binutils。这个软件包的编译一般很顺利,不会出现什么问题。
>培训教材

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。