查看完整版本: 建立针对arm-linux的交叉编译环境

fcc124 2006-11-6 22:46

建立针对arm-linux的交叉编译环境

[b]交叉编译环境介绍[/b]

交叉编译是[url=http://www.dz863.com/Embedded-Systems-Design/Embedded-Systems-Design.htm][color=#0000ff]嵌入式开发[/color][/url]过程中的一项重要技术,它的主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成,一般把前者称为目标机,后者称为主机。采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到高性能的主机中进行。

[b]linux[/b]下的[b]交叉编译环境[/b]重要包括以下几个部分:

* 针对目标系统的编译器gcc
* 针对目标系统的二进制工具binutils
* 目标系统的标准c库glibc
* 目标系统的[b]linux[/b]内核头文件

[b]交叉编译环境[/b]的建立步骤
下载源代码

下载包括binutils、gcc、glibc及[b]linux[/b]内核的源代码(需要注意的是,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致),并设定shell变量PREFIX指定可执行程序的安装路径。
编译binutils

首先运行configure文件,并使用--prefix=$PREFIX参数指定安装路径,使用--target=[b]arm[/b]-[b]linux[/b]参数指定目标机类型,然后执行make install。
配置[b]linux[/b]内核头文件

首先执行make mrproper进行清理工作,然后执行make config ARCH=[b]arm[/b](或make menuconfig/xconfig ARCH=[b]arm[/b])进行配置(注意,一定要在命令行中使用ARCH=[b]arm[/b]指定cpu架构,因为缺省架构为主机的cpu架构),这一步需要根据目标机的实际情况进行详细的配置,笔者进行的实验中目标机为HP的ipaq-hp3630 PDA,因而设置system type为SA11X0,SA11X0 Implementations中选择Compaq iPAQ H3600/H3700。

配置完成之后,需要将内核头文件拷贝到安装目录: cp -dR include/asm-[b]arm[/b] $PREFIX/[b]arm[/b]-[b]linux[/b]/include/asm cp -dR include/[b]linux[/b] $PREFIX/[b]arm[/b]-[b]linux[/b]/include/[b]linux[/b]
第一次编译gcc

首先运行configure文件,使用--prefix=$PREFIX参数指定安装路径,使用--target=[b]arm[/b]-[b]linux[/b]参数指定目标机类型,并使用--d[url=http://www.dz863.com/interface-circuits/ISA.htm][color=#0000ff]ISA[/color][/url]ble-threads、--d[url=http://www.dz863.com/interface-circuits/ISA.htm][color=#0000ff]ISA[/color][/url]ble-shared、--enable-languages=c参数,然后执行 make install。这一步将生成一个最简的gcc。由于编译整个gcc是需要目标机的glibc库的,它现在还不存在,因此需要首先生成一个最简的gcc,它只需要具备编译目标机glibc库的能力即可。
交叉编译glibc

这一步骤生成的代码是针对目标机cpu的,因此它属于一个交叉编译过程。该过程要用到[b]linux[/b]内核头文件,默认路径为$PREFIX/[b]arm[/b]- [b]linux[/b]/sys-[b]linux[/b],因而需要在$PREFIX/[b]arm[/b]-[b]linux[/b]中建立一个名为sys-[b]linux[/b]的软连接,使其内核头文件所在的 include目录;或者,也可以在接下来要执行的configure命令中使用--with-headers参数指定[b]linux[/b]内核头文件的实际路径。

configure的运行参数设置如下(因为是交叉编译,所以要将编译器变量CC设为[b]arm[/b]-[b]linux[/b]-gcc):

CC=[b]arm[/b]-[b]linux[/b]-gcc ./configure --prefix=$PREFIX/[b]arm[/b]-[b]linux[/b] --host=[b]arm[/b]-[b]linux[/b] --enable-add-ons

最后,按以上配置执行configure和make install,glibc的交叉编译过程就算完成了,这里需要指出的是,glibc的安装路径设置为$PREFIXARCH=[b]arm[/b]/[b]arm[/b]- [b]linux[/b],如果此处设置不当,第二次编译gcc时可能找不到glibc的头文件和库。
第二次编译gcc

运行configure,参数设置为--prefix=$PREFIX --target=[b]arm[/b]-[b]linux[/b] --enable-languages=c,c++。

运行make install。

到此为止整个[b]交叉编译环境[/b]就完全生成了。
几点注意事项

第一点、在第一次编译gcc的时候可能会出现找不到stdio.h的错误,解决办法是修改gcc/config/[b]arm[/b]/t-[b]linux[/b]文件,在 TARGET_LIBGCC2_CFLAGS变量的设定中增加-Dinhibit_libc和-D__gthr_posix_h。

第二点、对与2.3.2版本的glibc库,编译[b]linux[/b]thread/sysdeps/pthread/sigaction.c时可能出错,需要通过补丁glibc-2.3.2-[b]arm[/b].patch解决:执行patch -p1 < glibc-2.3.2-[b]arm[/b].patch

第三点、第二次编译gcc时可能会出现libc.so的错误,这是需要利用文本编辑器手动修改libc.so。
页: [1]
查看完整版本: 建立针对arm-linux的交叉编译环境