简单地讲,交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。这里的平台,实际上包含两个概念:体系结构 (Architecture) 、操作系统 (Operating System) 。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的 x86 Linux 平台实际上是 Intel x86 体系结构和 Linux for x86 操作系统的统称;而 x86 WinNT 平台实际上是 Intel x86 体系结构和 Windows NT for x86 操作系统的简称。
就ARM而言,之所以使用交叉编译是因为在该硬件上无法安装我们所需的编译器,只好借助于宿主机,在宿主机上对即将运行在目标机上的应用程序进行编译,生成可在目标机上运行的代码格式。
读者可以从 http://mac.os.nctu.edu.tw/->download 处下载工具链 : arm-elf-binutils-2.11-5.i386.rpm , arm-elf-gcc-2.95.3-2.i386.rpm , genromfs-0.5.1-1.i386.rpm 的文件复制到宿主机上的任一目录下。键入下面的命令来安装 rpm 包:
$su
# rpm – ivh *.rpm
RPM(Red Hat Package Manger) 软件包管理程序,是将原本复杂的软件包安装程序,轻松利用单一操作来完成。
RPM 目前支持的平台有 3 种类型: x86(i386) , Sparc 以及 Alpha ,可以很容易的从文件名就来判断出使用的平台。像目前下载文件比如 arm-elf-binutils-2.11-5.i386.rpm , arm-elf-binutils 表示文件名, 2.11 表示版本编号, 5 表示发行序号,也就是目前已经发行的次数, i386 是指此软件包为适用于 Intel x86 的二进制 (binary) 程序,也就是已经编译并且可以直接安装的软件包,最后的 “ rpm ” 表示这是 Red Hat 的 RPM 程序。每一版的 RPM 发布后,若是发现软件有问题,都会重新进行 patch 和 build ,这样在发行序号的部分就会增加 1 ,以表示该版本是上个版本的更新。
这里在所用的命令 rpm – ivh 中, -i 表示 Installation ,就是安装指定的 RPM 软件包; -h 表示 Hash ,该参数可在安装期间出现 ”#” 符号,来显示目前的安装过程,这个符号一直持续到安装完成后才停止;
-v 表示 Verbose ,显示安装时候的详细信息。
至此我们把交叉编译器已经安装到了宿主机。以后我们就可以用交叉编译器 arm-elf-gcc 编译操作系统内核和用户应用程序了。
读者也可以从网站 http://www.uclinux.org/pub/uClinux/arm-elf-tools/ 上下载最新的 arme-elf-gcc 工具 ,即脚本文件 arm-elf-tools-20030314.sh ,在宿主机上安装该工具链,在该文件所在目录下,键入:
$ su
# ls – l arm-elf-tools-20030314.sh
该命令显示文件的各种属性,如果该脚本文件属性的不是可执行的,则还需要输入命令:# chmod 755 arm-elf-tools-20030314.sh
以将其属性改为可执行属性,然后通过键入命令 :
# sh ./arm-elf-tools-20030314.sh
就可以执行该文件。执行后 /usr/local/bin/ 路径下有 gcc, g++, binutils, genromfs, flthdr 和 elf2flt 等各种实用工具。
说下我的系统平台:我用的是在Windows下的VMare+Red Hat Linux9.0(2.4.20-8)
首先下载如下版本的文件(其他的版本没试过):
skyeye:skyeye-0.7.0.tar.bz2 下载地址:http://gro.clinux.org/frs/download.php/714/skyeye-0.7.0.tar.bz2
arm-elf-tools:arm-elf-tools-20030314.sh 下载地址:http://www.lumit.org/download/tools/arm-elf-tools-20030314.sh
uClinux:uClinux-dist-20040408.tar.bz2 下载地址:http://uclinux.org/pub/uClinux/dist/uClinux-dist-20040408.tar.gz