嵌入式系统程序设计大连理工大学软件学院嵌入式系统工程系赖晓晨嵌入式系统开发工具链嵌入式系统开发工具链概述交叉开发环境的建立一、工具链概述高级语言编写的源代码文件主机系统目标处理器的汇编语言编写的源代码文件交叉编译器交叉汇编器目标文件目标文件连接器/加载器目标文件目标系统嵌入式系统软件开发流程开发环境分类开发环境分类:运行平台:本地开发环境、交叉开发环境商业角度:收费工具、免费工具GNU工具链GNU工具链:GNUTools:全称(GNUDevelopmentToolchains)GNUTools交叉开发环境:全称(GNUCross-PlateformDevelopmentToolchains)GNU既支持本地程序开发,又支持交叉编译GNU开发工具简介GNU开发工具自由软件完备的工具链:GCC、binutils、gdb、GNUmake、patch、CVS、开发库命令行方式:使用稍复杂、功能强大下载:开发工具基于ARM7平台的GNU开发工具(uclinux)arm-elf-asarm-elf-gccarm-elf-g++arm-elf-ldarm-elf-objcopyARM平台GNU开发工具(续)基于ARM9平台的GNU开发工具(linux)arm-linux-asarm-linux-gccarm-linux-g++arm-linux-ldarm-linux-objcopy下载:开发工具组成GNUTools是linux环境下昀主要的开发工具集,主要有以下几个部分:编译开发工具:把源程序编译为可执行文件,如gcc。调试工具:对执行程序进行源码或汇编级调试的软件,如gdb。软件工程工具:用于协助多人开发或大型软件项目的管理的软件,如make、cvs等。GNUTools开发工具组件介绍1.GCC(GNUCompilerCollection)支持C、C++、ADA、ObjectC、Java、Fortran、PASCAL等语言。主要包括:cpp:GNUC编译器的预处理器。gcc:符合ISO标准的C编译器。g++:基本符合ISO标准的C++编译器。gcj:GCC的java前端。gnat:GCC的GNUADA95的前端。组件介绍(续)2.binutils是一组二进制工具程序集合,是辅助GCC的主要软件。主要包括:as:GNU汇编器ld:GNU链接器ar:创建归档文件,向库中添加/提取obj文件nm:列出obj文件中的符号objcopy:复制和转化obj文件组件介绍(续)2.binutils主要包括:objdump:显示对象文件的信息ranlib:根据归档文件中内容建立索引readdlf:显示elf格式执行文件中的各种信息size:显示object文件和执行文件各段的总大小strings:显示文件中可以打印的字符strip:去掉执行文件中多余的信息(如调试信息)gprof:用来显示图表档案数据组件介绍(续)3.gdb:GNU调试器。可以用来调试C、C++和其他语言编写的程序。如加一些图形前端(如DDD),可以在图形环境下调试程序。4.GNUmake:是一个用来控制可执行程序生成过程、从其他源码文件中生成可执行程序的程序。它允许用户生成和安装软件包,而无需了解生成、安装软件包的过程。组件介绍(续)5.diff/diff3/sidff:比较文本差异的工具,也可以用来生成补丁。6.patch:补丁安装程序,可根据diff生成的补丁来更新程序7.CVS:版本控制系统。用于管理发行版本和控制在多位作者间同时编辑源码文件。ARM公司的开发工具ARMSDT2.5.2支持ARM9Armcc:ARM的C编译器Tcc:Thumb的C编译器Armlink:ARM链接器,生成ELF格式文件Armsd:ARM和Thumb的符号调试器Arm工程管理器ADWARM公司的开发工具(续)ARMADS1.2支持全系列ARM处理器代码生成工具(CodeGenerationTools)集成开发环境(CodeWarriorIDEfromMetrowerks)调试器(Debuggers)指令集模拟器(InstructionSetSimulators)ARM开发包(ARMFirmwareSuite)ARM应用库(ARMApplicationsLibrary)二、GNU交叉开发环境的建立1.编译源码配置安装GNU交叉开发环境。下载并解压缩交叉编译器相关源文件修改配置文件make测试2.直接安装二进制形式的工具链两种方式1、编译源码方式建立交叉开发环境1.下载需要的包如果只需要crosscompile内核,binutils和gcc就足够了,版本是binutils-2.16.1gcc-4.1.0如果需要交叉编译应用程序,那就还要再编译一份glibc。编译源码方式建立交叉开发环境建立举例(ppc):交叉开发环境建立举例:2.编译要按顺序来,先编binutils再编gcc,因为在编gcc的时候可能要用到前者。1.mkdirbinutils-ppc-build2.cdbinuitls-ppc-build3.../binutils-2.16.1/configure--target=powerpc-linux--disable-nls4.make5.makeinstall交叉开发环境建立举例:3.编译gcc为了用到上一步编译好的bintuils,确保这些程序所在的目录在你的PATH变量里。跟前面一样,先建一个build目录在开始工作1.mkdirgcc-ppc-build2.cdgcc-ppc-build3.../gcc-4.1.0/configure--target=powerpc-linux--disable-nls--disable-shared--disable-threads--enable-languages=c--without-headers4.makeall-gcc5.makeinstall-gcc交叉开发环境建立举例:4.交叉编译内核1.为了不把你本机的kernelbuild环境搞乱,昀好另建一份build目录。执行配置命令makeARCH=powerpcCROSS_COMPILE=powerpc-linux-menuconfig2.编译内核makeARCH=powerpcCROSS_COMPILE=powerpc-linux-3.编译成功后下载到目标机上,就可以拿来boot了。2、直接安装二进制工具链特点:适合初学者寻找难度视具体的目标板而定binutils、GCC、glibc库有依赖关系GNUTools与linux内核关系表yes2.3.23.3.22.14linux2.6xscalei386yes2.3.23.3.32.14linux2.6strongarmi386yes2.2.32.95.32.10.1linux2.4armppcno2.1.32.95.22.10.1linux2.4ppssparcyes2.0.6Egcs-1.1.22.8.1linux2.4mipsi386yes2.3.13.2.12.13.90linux2.4armi386no2.2.12.95.32.10.1linux2.4ppci386no2.3.23.3.12.14.90linux2.4i386i386patchsglibcgccbinutils系统内核目标机主机3、源码安装gcc过程(1)下载在GCC网站上()或者通过网上搜索可以查找到下载资源。目前GCC的昀新版本为4.2,我们以forx86的4.1.1为例来说明源码安装过程。可供下载的文件一般有两种形式:gcc-4.1.1.tar.gz和gcc-4.1.1.tar.bz2,只是压缩格式不一样,内容完全一致,下载其中一种即可。源码安装gcc过程(2)解压缩根据压缩格式,假设下载格式为tar.gz:新生成的gcc-4.1.1这个目录被称为源目录(用${srcdir}表示它)。在${srcdir}/INSTALL目录下有详细的GCC安装说明,可用浏览器打开index.html阅读。tarxzvfgcc-4.1.1.tar.gz源码安装gcc过程(3)建立目标目录目标目录(用${objdir}表示)是用来存放编译结果的地方。例如,可以这样建立一个叫gcc-build的目标目录(与源目录${srcdir}是同级目录):以下的操作主要是在目标目录${objdir}下进行。mkdirgcc-buildcdgcc-build源码安装gcc过程(4)配置配置的目的是决定将GCC编译器安装到什么地方(${destdir}),支持什么语言以及指定其它一些选项等。其中,${destdir}不能与${objdir}或${srcdir}目录相同。配置是通过执行${srcdir}下的configure来完成的。命令为(记得用你的真实路径替换${destdir}):将GCC安装在/usr/local/gcc-4.1.1目录下,支持C/C++和JAVA语言,其它选项参见GCC提供的帮助说明。../gcc-4.1.1/configure--prefix=/usr/local/gcc-4.1.1--enable-threads--disable-checking--enable--long-long--host=i386-redhat-linux--with-system-zlib--enable-languages=c,c++,java源码安装gcc过程(5)编译这是一个漫长的过程。在P4-1.6机器上,这个过程用了50多分钟make源码安装gcc过程(6)安装执行下面的命令将编译好的库文件等拷贝到${destdir}目录中(根据你设定的路径,可能需要管理员的权限):至此,GCC4.1.1安装过程就完成了。makeinstall源码安装gcc过程(7)设置GCC4.1.1的所有文件,包括命令文件(如gcc、g++)、库文件等都在${destdir}目录下分别存放,如命令文件放在bin目录下、库文件在lib下、头文件在include下等。由于命令文件和库文件所在的目录还没有包含在相应的搜索路径内,所以必须要作适当的设置之后编译器才能顺利地找到并使用它们。源码安装gcc过程(7-1)gcc、g++、gcj的设置要想使用GCC4.1.1的gcc等命令,简单的方法就是把它的路径${destdir}/bin放在环境变量PATH中。也可不用这种方式,而是用符号连接的方式实现,这样做的好处是我仍然可以使用系统上原来的旧版本的GCC编译器。源码安装gcc过程(7-1续)首先,查看原来的gcc所在的路径:上述命令显示:/usr/bin/gcc。因此:这样,就可以分别使用gcc4、g++4、gcj4来调用GCC4.1.1的gcc、g++、gcj完成对C、C++、JAVA程序的编译了。同时,仍然能够使用旧版本的GCC编译器中的gcc、g++等命令。whichgcccd/usr/binln-s${destdir}/bin/gccgcc4ln-s${destdir}/bin/g++g++4ln-s${destdir}/bin/gcjgcj4源码安装gcc过程(7-2)库路径的设置将${destdir}/lib路径添加到环境变量LD_LIBRARY_PATH中,昀好添加到系统的配置文件中,这样就不必要每次都设置这个环境变量了。例如,如果GCC4.1.1安装在/usr/local/gcc-4.1.1目录下,在RHLinux下可以直接在命令行上执行或者在文件/etc/profile中添加下面一句:setenvLD_LIBRARY_PATH/usr/local/gcc-4.1.1/lib:$LD_LIBR