• 沒有找到結果。

工具链软件

在文檔中 目 录 (頁 115-119)

第 5 章 交叉开发工具链

5.1 工具链软件

Linux 软件从一开始就使用 GNU 的工具链。这些 GNU 的工具和软件都是开放源码的,

可以免费下载源码编译。但是并不能以为任何一个版本拿来都能用,各种软件包存在版本匹 配问题,并且不同版本都有一些补丁。

一套完善的工具链对于嵌入式 Linux 开发非常重要。发行版的 Linux 都会包含一整套工 具链。工具链的维护和升级是 Linux 公司(特别是嵌入式 Linux 公司)非常重要的一项工作。

5.1.1 相关软件工程

GNU 的工具链源码包可以从 GNU 网站http://www.gnu.org或者镜像下载。这个站点有很 多 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 JAVA 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 测试支持范围

tyw藏书

处理器体系结构 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 版本,看看软件中大堆 的脚本和补丁。

$ wget -c http://www.kegel.com/crosstool/crosstool-0.38.tar.gz

$ tar –zxvf crosstool-0.38.tar.gz

$ cd 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 目录说明

目 录 说 明

buildlogs 编译各种各样版本的日志文件

contrib. 为社区贡献的补丁

doc 开发使用文档,初次接触的时候可以看一看

patches 各种版本工具的补丁,包含 binutils、gcc、glibc 各种版本的补丁

summaries 几种体系结构的测试结果总结

Crosstool 的维护者是 Dan Kegel,可以到http://www.kegel/crosstool/查看最新信息。

2.LFS(Linux From Scratch)

顾名思义,LFS 就是要指导人们从头开始制作 Linux 系统。它提供详细的操作步骤,从 源代码开始,一步一步地编译出自己的 Linux 系统。

LFS 最大的优点是可以按照自己的喜好和需要定制自己的系统。它可以帮助人们了解 Linux 系统从头到脚到底是怎么工作的,打造一个 LFS 系统的过程,把 Linux 内部各个部分 如何协调工作以及互相的依赖关系都展示出来。

LFS 第 2 个优点是可以从更大的程度上控制开发者自己的系统,而不依赖于别人打造的 工具。开发者成为了 Linux 系统每个部分的操纵者,比如目录的分配和起动脚本,开发者还 可以了解每一个程序是做什么的,装在哪里,如何安装。

LFS 第 3 个优点是你可以建立一个很小的 Linux 系统。在安装一般的 Linux 发行版的时 候,最后需要较大的硬盘空间,其中安装了一些可能并不需要的程序。可以建立一个小体积 的嵌入式 LFS 系统,成功地把一个系统缩减到了 8M,并且可以支持 Apache 网络服务器。 进 一步的简化可以把体积压缩到 5M 以下。

LFS 第 4 个优点是系统安全性。由于整个系统都是自己定制的,可以在编译系统源码的 时候加进任何一个想要的安全补丁,就不用去等别人打过补丁编译好的二进制包了。

这样的优点举不胜举,这只是其中比较突出的特点。随着 LFS 经验逐渐增加,你会在自 己身上发现知识所带来的力量。

tyw藏书

LFS 工程又分成几个项目,每个项目的内容如表 5.3 所示。其中 LFS 是最基本的文档,

其他项目的文档或者软件是进一步开发的工具。对于嵌入式 Linux 系统开发来说,LFS 和 CLFS 都是很好的文档。

5.3 LFS 文档项目

文 档 名 称 说 明

LFS(Linux From Scratch) 最主要的文档,它是其他项目的基础 BLFS(Beyond Linux From Scratch) 扩展根据 LFS 制作的系统功能 ALFS(Automated Linux From Scratch) 提供 LFS 等自动管理和编译的工具 CLFS(Cross Linux From Scratch) 提供各种体系结构的交叉编译方法 HLFS(Hardened Linux From Scratch) 关注系统的安全性

Hints 提高系统性能的说明文档,LFS 或者 BLFS 没有包含的部分

LiveCD LFS 开发主机光盘和修复盘

Patches 构建 LFS 主要的补丁

最新版本的 LFS 文档可以从 LFS 站点http://www.linuxfromscratch.org下载。

LFS 本文档列出了构建 LFS 需要的所有软件包索引。每个软件包都列出了软件包的主页、

使用手册和相关资料的链接地址。LFS 书包含了构建 LFS 的所有东西,有充足的信息,并且 还有一些培训资料。因此,可以自己解决使用过程中的问题。

这里是开始理解曾经安装过的软件的好地方,但是要自己动手编译这个系统。这个自己 动手构建的 Linux 系统是在 X86 的平台上的。对于嵌入式 Linux 系统开发,可以重点学习一 些工具软件和系统软件包。

CLFS(Cross Linux From Scratch)告诉读者如何制作一个交叉编译器以及必需的工具。

基于各种体系结构构建一个基本的系统。例如:可以在 X86 系统上制作 Sparc 工具链,并且 利用这个工具链从源码编译 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.1.tar.gz。解压到 glibc 源码树中。

tyw藏书

对于 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 工具链制作流程

由于工具链是几个软件包组合编译生成的,所以每个软件包的编译并不是独立的,相互 存在依赖关系。

一个关键的问题是完整的 GCC 编译器是依赖于 glibc 的,而 glibc 需要对应体系结构的 GCC 来编译。这怎么解决呢?先编译一个辅助的 GCC 编译器(Bootstrap compiler),用来编 译 glibc,然后再重新编译完整的 GCC 编译器。

图 5.1 是编译工具链的流程图。可以把这个过程划分为 5 个步骤。

binutils源码

内核源码 glibc源码

gcc源码

本地编译 binutils工具

本地编译 辅助编译器 glibc库

本地编译 完整的gcc编 译器

图 5.1 交叉工具链编译流程图

① 做好准备工作。下载工具源码包和补丁,准备内核头文件,创建工作目录等。

② 编译 binutils。这个软件包的编译一般很顺利,不会出现什么问题。

完整的 GCC 编译器

tyw藏书

③ 编译辅助编译器。这一步使用简化配置,编译通常也很顺利。

④ 编译 glibc 库。这里要使用交叉编译工具链,例如:arm-linux-gcc 等。

⑤ 编译生成完整的 GCC 编译器。重新配置 GCC 功能,使其支持 C、C++等语言。

注意在配置编译之前,首先要查看所有补丁,把需要的补丁打进去。有的补丁可以解决 编译过程的语法错误,有的补丁专门修正对某个体系结构的支持,有时还要手工地修改一些 文件内容。其中,后两步编译过程最麻烦,编译一般会出现一些错误。

编译 binutils、gcc、glibc 是最基本的工具链。如果要调试程序,还离不开调试器 gdb。相 对来说,gdb 的编译很简单,它也应该作为工具链配套提供。最后还要编译安装交叉调试器。

本章的内容着重描述制作过程,而且举例说明的版本已经顺利编译通过。但是在使用过 程中,很有可能发现工具链在某个方面存在问题,甚至严重的 BUG,这就需要不断地修正 BUG,它和 Linux 内核一样是不断发展提高的。

在文檔中 目 录 (頁 115-119)