前言
交叉编译,即在一种平台上编译,并能够运行在另一种体系结构完全不同的平台上。交叉编译使用的工具,一般称为交叉编译工具,由于它是由多个程序构成,所以又称为交叉编译工具链。
交叉开发工具链就是为了编译、链接、处理和调试跨平台体系结构的程序代码。每次执行工具链软件时,通过带有不同的参数,可以实现编译、链接、处理或者调试等不同的功能。
工具链的组成
工具链一般由编译器、连接器、解释器和调试器组成。
Linux下经常使用的工具链软件有:Binutils、GCC、Glibc和Gdb。
Binutils是二进制程序处理工具,包括连接器、汇编器等目标程序处理的工具。
GCC(GNU Compiler Collection)是编译器,支持C/C++等多种语言。对于C/C++语言的完整支持,需要Glibc库。
Glibc是应用程序编程的函数库软件包,可以编译生成静态库和共享库,完整的GCC需要支持Glibc。
Gdb是调试工具,可以读取可执行程序中的符号表,对程序进行源码调试。
通过这些软件包,可以生成gcc、g++、ar、as、ld等编译链接工具,还可以生成glibc库和gdb调试器。在生成交叉开发的工具链时,可以在文件名字上加一个前缀,用来区别本地的工具链,例如,arm-linux-gcc,表示这个编译器用于编译在Linux系统下ARM目标平台上运行的程序。
构建工具链
在裁剪用于嵌入式系统的Linux内核时,由于嵌入式系统的存储大小有限,所以我们需要的链接工具也可根据嵌入式系统的特性进行制作,建立自己的交叉编译工具链。例如,有时为了减少Glibc库的大小,可以考虑用uclibc、dietlibc或者newlib库赖代替Glibc库,这时就需要自己动手进行交叉编译工具链的构建。由于Linux交叉编译工具链使用和GNU一样的工具链,而GNU的工具和软件都是开发源码的,所以只需从GNU网站 http://www.gnu.org 或者镜像网站(http://baike.baidu.com/link?url=RdaR4T7Ptp3kOmYKBeRhgFxwW3juKAr4Y-G8DpvUqj0vRKdRMvZqgjwKGSVPO_0A)下载源码后,根据需要进行裁剪,然后编译即可。
当然,构建交叉编译工具链是一个相当复杂的过程,如果不想经历这一过程,可以在网上下载一些编译好的工具链。
构建交叉编译器的第一个步骤就是确定目标平台。在GNU系统中,每个目标平台都有一个明确的格式,这些信息用于在构建过程中识别要使用的不同工具的正确版本。因此,当在一个特定目标机下运行GCC时,GCC便在目录路径中查找包含该目录规范的应用程序路径。GNU的目标规范格式为CPU-PLATFORM-OS。例如,x86/i386目标机名为i686-pc-linux。我们这里要建立基于ARM平台的交叉工具链,所以目标平台名为arm-linux。
通常,构建交叉编译工具链有如下三种方法:
(1)分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方法相对比较困难,如果只是想使用交叉编译工具链,建议使用下面方法。
(2)通过Crosstool脚本工具来实现一次编译,生成交叉编译工具链,该方法相对方法(1)简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。
(3)直接通过网上下载已经制作好的交叉编译工具链。优点很明显:简单易行。弊端:局限性太大,因为毕竟是别人构建好的,也就是固定的,没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许会在使用时出现许多莫名其妙的错误,建议慎用此方法。
自行构建交叉编译工具链时所需要的资源可从以下两个网站获取: