资源描述:
《gcc交叉编译平台建立过程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、GCC交叉编译平台建立过程(人工智能与机器人研究所李国辉)基于嵌入式系统的开发环境主要涉及到交叉编译器,汇编器、链接器等。这些工具一般由开发cpu的厂商提供,可以直接在windows下或者在linux下运行。本文的目的并不是具体的讲述如何去使用这些工具,而是当得不到这些现成的工具时,自己如何去构造这些工具。构造的方法就是应用gcc的源代码建立针对目标处理器的交叉编译平台。GCC(GNUCompilerCollection)是现阶段被广泛使用的开放源码的编译器,它支持多种高级语言(c,c++,fortran,java,ad
2、a),同时支持多种处理器(alpha,arm,avr,IA-64,intel386,AMD,mips,mmix,powerpc,sparc,pdp-11…),它不仅因为其支持多目标的特性而被广大厂商使用,更是因为其在生成代码的质量、速度上的优秀表现而获得广泛的赞美。下面具体讲述交叉编译平台建立过程。一、准备工作1.安装linux操作系统这个平台是在linux下建立起来的,所用的linux版本为redhatv9.2。所用的本地编译器为gcc3.2.2(redhatv9.2自带的gcc)。用这个本地编译器编译gcc的源代码使
3、之产生针对arm处理器的交叉编译器。本地编译器是指它编译出来的程序可在本地机(即运行编译器的机器)上运行;而交叉编译器编译出来的程序不可以在本地机上运行。如下图所示:Gcc源代码C语言应用程序Gcc3.2.3本地编译器Gcc交叉编译器在本地机上运行针对目标机器(arm)的可执行文件需要说明的是,由于linux下的一些程序并不具有很好的兼容性和稳定性,因此所用的gcc本地编译器最好是稳定的版本(比如gcc3.2.2),而不要一味地追求最高的版本。2.为目标机器建立binutils.Binutils是一个工具包,它包含汇编器
4、、链接器以及管理静态库、动态库的一些工具。我们从网上下载的一般是binutils的源文件,我们需要把它编译成针对目标机(arm)的工具,这样编译后得到的汇编器是针对arm的汇编器,链接器也是针对arm的链接器。首先从网上下载binutils-2.13.2.1.tar.gz,执行以下命令:tar–xzvfbinutils-2.13.2.1.tar.gz新生成的binutils-2.13.2.1被称为源目录,用${srcdir}表示它。以后在出现${srcdir}的地方,应该用真实的路径来替换它。然后建立目标目录,目标目录(
5、用${objdir}表示)是用来存放编译结果的地方。GCC建议编译后的文件不要放在源目录${srcdir}中(虽然这样做也可以),最好单独存放在另外一个目录中,比如${srcdir}的同级目录。用cd命令进入目标目录,然后执行以下命令:${srcdir}/configure--prefix=/usr/local--target=arm-elf--with-cpu=arm8配置的目的是将binutils安装到什么地方,在这里为/usr/local,在linux系统下,这个目录就是用来存放安装结果的地方。--targeth和
6、--with-cpu选项说明了生成的汇编器和链接器等是针对arm处理器的,具体是arm系列的arm8处理器,并且该处理器上还没有运行操作系统(大多数嵌入式系统都是这样的)。该命令执行${srcdir}目录下的configure文件,同时接受用户输入的选项,然后生成Makefile。Makefile说明了gcc众多源文件的编译顺序和依赖关系。用户在编译gcc源代码时,不需要依次对各源文件进行编译,只需执行make命令即可,它能解释makefile里的编译顺序和依赖关系,一次性完成全部的编译过程。关于Makefile的更进一
7、步的探讨,有兴趣的同学可以参考附录。配置完成之后然后执行以下两个命令就完成了安装过程:makemakeinstall其中执行makeinstall要求用户具有超级权限。执行以下命令会看到编译生成的工具:ls/usr/local/binarm-elf-asarm-elf-ldarm-elf-arls/usr/local/arm-elfbinlib我们可以看到/usr/local是binutils安装用到的最上层目录,在执行configure命令时通过--prefix设置了这个最上层目录。二、构造交叉编译器如果准备工作已经就
8、绪,剩下的就是构造这个新的编译器了。构造编译器所需的步骤基本上与构造binutils的步骤相同,需要建立目标目录然后在目标目录里执行configure、makeall-gcc、makeinstall-gcc命令就完成了编译过程。${srcdir}/configure--prefix=/usr/local--targe