版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河北工业大学城市学院2012届本科毕业设计说明书PAGEPAGE24PAGE1毕业设计中文摘要ARM-Linux交叉编译环境的创建摘要:交叉编译就是在一个平台生成可以在另一个平台执行的代码,它作为嵌入式系统开发的前提和准备,具有相当重要的作用,嵌入式系统的可执行文件都是通过交叉编译生成的。本文详细介绍了建立嵌入式交叉编译环境的具体步骤,通过分步编译Binutils、GCC、glibc和GDB,最终成功完成了基于ARM-Linux的交叉编译环境的建立,并成功通过测试。在本设计中还列举了用crosstool-ng构建交叉编译工具链的方法,这个方法比前一种简单,而且比较快捷。这两种方法制作的交叉编译环境都具有高度的可靠性和稳定性,并且具有较好的实用价值。关键词:嵌入式linuxarm交叉编译环境gcc目次1引言 21.1课题研究的目的意义 21.2课题历史背景 31.3开发方案的选择 62了解嵌入式开发 72.1Linux常用命令 72.1.1文件目录类 72.1.2驱动挂载类 72.1.3压缩解压类 82.1.4源代码包安装 82.1.5进程控制类 92.1.6用户帐号类 92.1.7网络服务 92.2GCC包括的工具。 92.3交叉调试概念 103.分步编译安装源代码与库文件方法 113.1创建编译环境 123.1.1首先设置环境变量: 123.1.2创建相关目录 123.1.3安装linux头文件 123.2编译binutils 133.3编译bootstrap-gcc 143.4编译Glibc 153.5编译完整Gcc 173.6编译GDB 174用crosstool-ng构建交叉编译工具链 194.1下载crosstool-ng 204.2安装所必须的工具文件 204.3安装crosstool-ng 204.4复制交叉编译文件 204.5配置交叉编译工具链 214.6编译工具链 224.7增加环境变量 22结论 24参考文献 25致谢 271引言1.1课题研究的目的意义嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应的要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。像我们平常常见到的手机、PDA、电子字典、可视电话、VCD/DVD/MP3Player、数字相机(DC)、数字摄像机(DV)、U-Disk、机顶盒(SetTopBox)、高清电视(HDTV)、游戏机、智能玩具、交换机、路由器、数控设备或仪表、汽车电子、家电控制系统、医疗仪器、航天航空设备等等都是典型的嵌入式系统。伴随着嵌入式产品的迅速发展,使得嵌入式软件开发再度成为一个研究热点。由于嵌入式设备的性能局限,往往不能通过本机编译得到所需软件的可执行程序。因此,以Linux为主机操作系统,搭配一个交叉编译系统,为嵌入式设备生成可执行程序已成为现在日益流行的编译嵌入式软件的解决方案。而开放源码的编译器GCC,经过多年的发展,已能支持几乎所有知名厂商的处理器,是嵌入式软件开发中理想的交叉编译器。但现有GCC支持的平台并不能满足层出不穷的嵌入式产品的开发需要,仍有许多平台得不到支持。随着信息技术的发展,微型化和专业化成为信息产品发展的新趋势,嵌入式产品成为信息产业的主流。而ARM技术的日益成熟和广泛应用,使得基于ARM核的微处理器已经成为嵌入式市场的首选。建立面向ARM构架的嵌入式操作系统也就成为当前研究的热点问题。在众多的嵌入式操作系统中,许多开发人员都选择Linux,主要是因为它是源码公开而且是免费的,可以让任何人将其修改移植到自己的目标平台系统里使用。系统可以通过配置内核,动态地加载和卸载内核模块机制,可以方便地在内核中添加新的组件或卸载不再需要的内核组件。交叉编译环境是嵌入式开发必不可少的工具,在进行项目开发的时候必须搭建一套开发环境,包括操作系统、连接器、编译器及调试器在内的软件开法工具。交叉编译的实现解决了嵌入式系统目标平台存储空间和运算能力有限的缺点,完善的工具链可以保证项目开发的进度和质量,是嵌入式开发的基础。1.2课题历史背景Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。20世纪50年代,IBM的JohnBackus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,NoamChomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言分类。正如现在所称的Chomsky架构(ChomskyHierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关文法)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsingproblem,用于上下文无关文法识别的有效算法)的研究是在60年代和70年代,它相当完善的解决了这个问题。现在它已是编译原理中的一个标准部分。有限状态自动机(FiniteAutomation)和正则表达式(RegularExpression)同上下文无关文法紧密相关,它们与Chomsky的3型文法相对应。对它们的研究与Chomsky的研究几乎同时开始,并且引出了表示程序设计语言的单词的符号方式。人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其称为优化技术(OptimizationTechnique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(CodeImprovementTechnique)。当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构造。这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器(ParserGenerator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是Yacc(YetAnotherCompiler-compiler),它是由SteveJohnson在1975年为Unix系统编写的。类似的,有限状态自动机的研究也发展了一种称为扫描程序生成器(ScannerGenerator)的工具,Lex(与Yacc同时,由MikeLesk为Unix系统开发)是这其中的佼佼者。在20世纪70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(InteractiveDevelopmentEnvironment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向。另一方面,尽管近年来在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变,它现在正迅速地成为计算机科学课程中的中心环节。在20世纪90年代,作为GNU项目或其它开放源代码项目标一部分,许多免费编译器和编译器开发工具被开发出来。这些工具可用来编译所有的计算机程序语言。它们中的一些项目被认为是高质量的,而且对现代编译理论感兴趣的人可以很容易的得到它们的免费源代码。大约在1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(OperatingSystem)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86Linux平台实际上是Intelx86体系结构和Linuxforx86操作系统的统称;而x86WinNT平台实际上是Intelx86体系结构和WindowsNTforx86操作系统的简称。有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用VisualC++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为nativecompilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilationtoolchain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。交叉编译就是在一个平台上通过编译器编译某个源程序,生成的可执行代码在另一个平台上也能运行。经典的交叉编译是指在PC机上编译出能在嵌入式目标机上运行的可执行代码。因为嵌入式的目标主机硬件资源有限,不能独立自主的完成程序的编译工作,从另外一个角度,嵌入式主机上运行的程序调试稳定后,基本不需要修改,也没有必要具备完成自身程序的编译工作。因此,在嵌入式系统开发时,常常由宿主机开发程序,目标机作为执行机。两者在开发时需要时时交替结合进行。一般把编译程序的主机称为宿主机(Host),把运行程序的嵌入式主机称为目标机(Target)。为了使宿主机上开发的程序(应用程序和驱动程序)能够方便地下载到目标机上运行,一般还要在宿主机上配置好网络,使其支持NFS或tftp等网络服务,从而实现两台机器之间的文件共享。交叉编译环境一般由交叉编译器、交叉连接器和C程序库glibc等一系列的交叉工具集组成。这些交叉工具通过配置二进制工具Binutils包来产生。通常基于ARM的Linux交叉编译器为arm-linux-gcc、交叉连接器arm-linux-ld。1.3开发方案的选择Linux环境模式选择:嵌入式Linux操作系统是交叉编译环境搭建的重要基础,只有有了操作系统的支持,整个系统才能有条不紊的进行。Linux开发环境方案有以下几种:Windows+Linux+目标系统:安装多个操作系统只需一台计算机,但是在调试应用程序时需要在两个系统之间进行切换,会比较麻烦和费时;Windows+Cygwin+目标系统:Cygwin是一个模拟Linux环境软件,此模式具有快速省时的优点,但并不能真实的模拟Linux,且系统稳定性差;Windows+Vmware虚拟机(Linux)+目标系统:Vmware可以在不破坏原有操作系统的基础上,虚拟出一台真实的计算机出来,只需要在这台虚拟计算机上安装Linux,其效果和真实Linux系统完全一样。我选择的是第三种方法,这种方法可能会编译的慢些,但是方便与网络的互联,与Windows下的文件共享也方便,一边在虚拟机上调试方法,一边在Windows上查阅资料,一台电脑可以当两台用,确实很方便。通过安装crosstool-ng,复制交叉编译文件,配置交叉编译工具链,编译工具链,增加环境变量,最终制作出适合需要的交叉编译工具。2了解嵌入式开发2.1Linux常用命令2.1.1文件目录类1)mkdir目录名 建立目录2)rmdir目录名 删除空目录3)rm-rf目录名 无条件删除子目录4)cd目录名 改变当前目录(进入用户home目录:cd~;进入上一级目录:cd..)5)pwd 查看自己所在目录6)du 查看当前目录大小7)ls–l 显示目录文件列表(-a:增加显示隐含目录)其中:蓝:目录;绿:可执行文件;红:压缩文件;浅蓝:链接文件;灰:其他文件;红底白字:错误的链接文件8)cat文件名 浏览文件9)cp源文件目标文件 复制文件(-r:包含目录)10)find文件名 查找文件11)ln源文件链接文件 建立hard链接(-d:创建目录链接);2.1.2驱动挂载类1)df–h 检查硬盘使用的情况2)fdisk–l 检查磁盘分区3)mount 挂载软硬光区,其中: 挂载光驱:mount-tauto/dev/cdrom/mnt/cdrom 挂载ISO文件:mount-tiso9660-oloopxxx.iso/path4)umount/mnt/目录名 解除挂载(解除所有的挂载:umount-a)5)mkfs 建立文件系统2.1.3压缩解压类1).tar 解包:tarxvfFileName.tar打包:tarcvfFileName.tarDirName2).gz 解压1:gunzipFileName.gz;解压2:gzip-dFileName.gz压缩:gzipFileName3).tar.gz和.tgz 解压:tarzxvfFileName.tar.gz压缩:tarzcvfFileName.tar.gzDirName4).bz2 解压1:bzip2-dFileName.bz2;解压2:bunzip2FileName.bz2压缩:bzip2-zFileName5).tar.bz2 解压:tarjxvfFileName.tar.bz2压缩:tarjcvfFileName.tar.bz2DirName6).tar.bz 解压:tarjxvfFileName.tar.bz压缩:未知7).Z 解压:uncompressFileName.Z压缩:compressFileName8).zip 解压:unzipFileName.zip压缩:zipFileName.zipDirName2.1.4源代码包安装1)配置:在解压目录下./configure2)编译:在解压目录下make3)安装:在解压目录下makeinstall2.1.5进程控制类1)ps-auxw 列出当前进程ID;2)kill进程ID号 终止单一进程;3)Killall程序名 终止该程序所有进程;4)xkill 终止X-Window程序;5)top 查看资源占用情况;6)env 查看环境变量的值;7)reboot 重启;8)shutdown-hnow 关机;2.1.6用户帐号类1)增加用户帐号: 用户名:adduser帐号名2)设置密码: passwd帐号名3)删除用户帐号: userdel帐号名4)增加用户组: groupadd用户组名5)删除用户组: groupdel用户组名6)暂时终止用户帐号:passwd-l帐号名7)恢复被终止帐号: passwd-u帐号名2.1.7网络服务1)ifconfig 显示网络接口的参数2)mail 显示系统的邮件3)httpd-kstart|stop 启动或终止web服务4)pingxxx.xxx.xxx.xxx 查看网络状况,联机状况:ping[-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或IP地址]2.2GCC包括的工具。1)cppGNU预处理器,主要用于扩展用户源程序的头文件和宏定义。cpp是GNUC编译器的预处理器。cpp是一个宏指令处理器,GNUC编译器在编译前自动使用cpp对用户程序进行转换。cpp之所以称为宏指令处理器是因为它允许用户定义宏指令(长结构的简写)。2)GCC符合ISO等标准的C编译器。3)g++基本符合ISO等标准的C++编译器。4)Binutils是一组二进制工具程序集,它包括addr2line、ar、as、gprof、ld、nm、objcopy、objdump、ranlib、size、strings、strip等工具。是辅助GCC的主要软件。5)AsGNU汇编器(Assemble),主要用于把汇编代码转换成二进制代码,并存放到一个object文件中。6)LdGNU链接器(Linker),主要用于确定相对地址,把多个object文件、起始(Startup)代码段、库(Library)等链接起来,并最终形成一个可执行文件。7)Addr2line把可执行程序中的地址映射到源文件的对应行。8)Ar创建归档文件(Archive)。修改/替换掉库中的object文件。向库中添加/提取object文件。9)C++file解码C++符号名。10)Nm列出object文件中的符号。11)Objcopy用来显示对象文件的信息。12)Ranlib根据归档文件(Archive)中内容建立索引。13)Readelf显示object文件和执行文件各节(Section)和总的大小。14)Strings显示文件中可以打印的字符。15)Strip去掉执行文件中多余的信息(如调试信息等),可减少执行文件的大小。2.3交叉调试概念在开发嵌入式应用软件时,交叉调试是必不可少的一步。嵌入式应用的特点决定了其调试具有如下的特点:1)调试器(Debugger)和被调试程序(Debuggee)运行在不同的计算机上。Debugger运行在一般的PC机或者工作站上(即Host上),而Debuggee运行在实际的某种嵌入式设备或者专业的评估板上(都被称为Target)。2)Debugger通过某种通信方式与目标机建立联系。通信方式可以是串口、并口、网络、或者专用的通信方式。3)一般在目标机上有Debugger的某种代理(Agent),这种代理能与Debugge一起配合完成对目标机上运行的程序的调试。这种代理可以是某种软件,也可以是某种支持调试的硬件等。4)目标机也可以是一种虚拟机。在这种情形下,似乎Debugger和Debuggee运行在了同一台计算机。但是调试方式的本质没有变化,即Debuggee都是被下载到了目标机,对Debuggee的调试并不是直接通过Host的操作系统的调试支持来完成的,而是通过虚拟机代理的方式来完成调试。3.分步编译安装源代码与库文件方法交叉编译使用的软件包如下表1整个编译过程的步骤:⑴创建编译环境。在该这过程中,将设置必须的环境变量,创建安装目录,安装内核源代码和头文件等。⑵创建binutils。创建完毕后,会创建类似arm-linux-ld等工具。⑶创建一个交叉编译版本的gcc。这个过程中,只能编译c程序,不能编译c++程序⑷创建一个交叉编译版本的glibc。⑸创建一个交叉编译版本的gdb。会创建arm-linux-gdb⑹重新创建gcc。⑺最后重新创建glibc。3.1创建编译环境下载的压缩文件存放在/usr/src/tars中;解压之后的文件存放在/usr/src/source中;解压后的linux内核存放在/usr/src/linux中;编译的路径在/usr/src/build中;生成的arm-linux交叉编译工具在/usr/local/arm-linux中。3.1.1首先设置环境变量:#exportVBINUTILS=2.16#exportVGCC=3.4.4#exportVGLIBC=2.3.3#exportVGLIBCTHREADS=2.3.3#exportVGDB=6.4#exportVLinuxKERNEL=#exportPREFIX=/usr/local#exportHOST=i686-pc-linux-gnu#exportARCH=arm#exportTARGET=arm-linux#exportTDIR=/usr/src/tars#exportSDIR=/usr/src/source#exportBDIR=/usr/src/build3.1.2创建相关目录#mkdir–p$SDIR#mkdir–p$BDIR#mkdir–p$BDIR/binutils#mkdir–p$BDIR/gcc#mkdir–p$BDIR/glibc#mkdir–p$BDIR/gdb3.1.3安装linux头文件#cd/usr/src#tarzxvj$TDIR/linux-$VLinuxKERNEL.tar.bz23.1.4使用ARM平台的库文件。创建相关链接。#cdlinux$VLinuxKERNEL/include/asm-arm#rm–farchproc#ln–sarch–s3c2410arch#ln–sarch–s3c2410arch#ln–sproc–armvproc#cd../../3.2编译binutils首先要安装的软件包是binutils,这步非常重要,Glibc和gcc会针对可用的连接器和汇编器进行多种测试,来决定打开某些特性。解压binutils软件包:#cd$SDIR#tarxvfj$TDIR/binutils-$VBINUTILS.tar.bz2#cd$BDIR/binutils配置,编译和安装binutils#$SDIR/binutils-$VBINUTILS/configure–host=$HOST\--target=$TARGET\--prefix=$PREFIX\--with-lib-path=$PREFIX/$TARGET/lib:\$PREFIX/$TARGET/lib/be:\$PREFIX/$TARGET/lib/soft-float:\$PREFIX/$TARGET/lib/be/soft-float\#make#makeinstall#chmod777$PREFIX/$TARGET/arm-linux目录下有bin和lib两个子目录。Bin目录下保存了二进制文件,即ar、as、ld、nm、ranlib、和strip几个文件。Lib目录下有ldscripts子目录,里边存放了一些脚本文件。/bin目录下存放生成的二进制工具,这些文件是用语ELF执行格式的,前缀使用arm-linux。/lib目录下存放了libiberty.a库文件。3.3编译bootstrap-gcc创建交叉编译版本的gcc,需要交叉编译版本的Glibc及头文件,而交叉编译版本的Glibc是通过交叉编译版本的gcc创建的。先编译对c语言的支持,并禁止支持线程。编译gcc之前需要进行修改,首先修改gcc源代码中的gcc/config/arm/t-linux文件。#justforthese,weomittheframepointersinceitmakessuchabig#difference.ItisthenpointlessaddingdebuggingTARGET_LIBGCC2_CFLAGS=-pomit-frame-pointer-fPIC-Dinhibit_libc-D__gthr_posixLIBGCC2_DEBUG_CFLAGS=-g0#don`tbuildenquireENQUIRE=LIB1ASMSRC=arm/lib1funcs.asmLIB1ASMFUNCS=_udivsi3_divsi3_umodsi3_modsi3_dvmd_lnx\_bb_init_func_call_via_rX_interwork_call_via_rX\_negdf2_addsubdf3_muldivdf3_cmpdf2_unorddf2_fixdfsi_fixunsdfsi\_truncdfsf2_negsf2_addsubsf3_muldivsf3_cmpsf2_unordsf2\_fixsfsi_fixunssfsi#MULTILIB_OPTIONS=mhard-float/msotf-float#MULTILIB_DIRNAMES=hard-floatsoft-float#EXTRA_MULTILIB_PARTS=crtbegin.ocrtend.oMULTILIB_OPTIONS=mlittle-endian/mbig-endianmhard-float/msoft-floatMULTILIB_DIRNAMES=lebehard-floatsoft-floatEXTRA_MULTILIB_PARTS=crtbegin.ocrtbeginS.ocrtend.ocrtendS.ocrti.ocrtn.oLIBGCC=stmp-multilibINSTALL-LIBGCC=install-multilibT_CFLAGS=-Dinhibit_libc–D___gthr_posix_h#LIBGCC=stmp-multilib#INSTALL_LIBGCC=install-multilib#Assemblestartupfiles.$(T)crti.o:$(srcdir)/config/arm/crti.asm$(GCC_PASSES)$(GCC_FOR_TARGET)$(GCC-CFLAGS)$(MULTILIB_CFLAGS)$(INCLUDES)\-c–o$(T)crti.o–xassembler-with-cpp$(srcdir)/config/arm/crti.asm$(T)crtn.o:$(srcdir)/config/arm/crtn.asm$(GCC_PASSES)$(GCC_FOR_TARGET)$(GCC_CFLAGS)$(MULTILIB_CFLAGS)$(INCLUDES)\-c–o$(T)crtn.o–xassembler-with-cpp$(srcdir)/config/arm/crtn.asmTARGET_LIBGCC2-CFLAGS=-fomit-frame-pointer-fPICLIBGCC2_DEBUG_CFLAGS=-g0LIB1ASMSRC=arm/lib1funcs.asmLIB1ASMFUNCS=_udivsi3_divsi3_umodsi3_modsi3_dvmd_lnx需要修改gcc/config/arm/linux-elf.h文件,删除文件中对LIBGCC-SPEC的定义。接下来解压软件包、配置、编译、安装等。#cd$SDIR#tarxvfj$TDIR/gcc-$VGCC.tar.bz2#cd$BDIR/gcc#../configure–target=$TARGET--disable-shared--disable-threads--prefix=$PREFIX--with-headers=/usr/src/linux-$VLinuxKERNEL/include--with-gnu-as--with-gun-ld--enable-multilib--enable-languages=cap:/embedded/app#makeap:/embedded/app#makeinstall3.4编译Glibcglibc是gnu发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于glibc囊括了几乎所有的
UNIX
通行的标准,可以想见其内容包罗万有。而就像其他的UNIX系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个作业系统。在GNU/Linux系统中,其C函式库发展史点出了GNU/Linux演进的几个重要里程碑,用glibc作为系统的C函式库,是GNU/Linux演进的一个重要里程碑。创建Glibc需要的时间很长,也容易出错。之前创建了arm-linux-gcc,arm-linux-ar和arm-linux-ranlib等工具。在编译Glibc前,还要进行一些修改。#cd$SDIR#tarxvfz$TDIR/glibc-$VGLIBC.tar.gz#cd$SDIR/glibc-$VGLIBC#rm–rfnptl#tarxvfz$TDIR/glibc-linuxthreads-$VGLIBCTHREADS.tar.gz源代码准备好后,修改4个文件,Sysdeps/unix/sysv/linux/arm/ioperm.c把文件中的BUS_ISA修改为CT_BUS_ISA.Config.make.in将文件中的slibdir=@libc_cv_slibdir@修改为slibdir=@libdir@.Makeconfig修改优化级别,从o2改为o。Configure修改优化级别,从o2改为o。然后还要创建一个文件:#touchsysdeps/arm/framestate.c然后开始编译工作:#cd$BDIR/glibc#CC=”arm-linux-gcc–mbig-endian–finline-limit=10000AS=”arm-linux-as–mbig-endian”LD=”arm-linux-ld–EB”$SDIR/glibc-$VGLIBC/configure–host=$TARGET--build=i686-pc-linux-gnu--with-headers=/usr/src/linux-$VLinuxKERNEL/include--enable-add-ons--enable-shared--prefix=$PREFIX/$TARGET--libdir=/$PREFIX/$TARGET//lib/be#make#makeinstall3.5编译完整Gcc之前做出来的Glibc和头文件,现在创建完整的Gcc。gcc/config/arm/t-linux删除文件中的”-Dinhibit_libc”选项,这个选项是我们在编译bootstrap_gcc时添加进去的,当时是为了绕过一些检查。gcc/config/arm/linux-elf.h如果编译bootstrap_gcc的过程中没有做过这个操作,则删除文件中“LIBGCC_SPEC”的定义。libjava/java/net/natInetAddressPosix.cc在gcc源代码目录中执行下面命令即可。Perl–pi–e`s/intnamelen/unsignedintnamelen/`libjava/java/net/natLnetAddressPosix.cc然后开始编译#cd$BDIR#rm–rfgcc#mkdirgcc#$SDIR/gcc-$VGCC/configure--target=arm-linux-disable-shared--prefix=$PREFIX--with-headers=/usr/src/linux-$VLinuxKERNEL/include--with-gnu-as--with-gnu-ld--enable-languages=c#make#makeinstall3.6编译GDBGUN的GDB是一款非常强大的调试器。如果要调试的是ARM的可执行代码,需要交叉编译后的GDB。#cd$SDIR#tarxvfj$TDIR/gdb-VGDB.tar.bz2#cd$BDIR/gdb#$VGDB/configure–build=$HOST--target=$TARGET--perfix=$PREFIX#make#makeinstall编译完成,下面是各目录作用:$PREFIX目录结构目录名内容Arm-linux和target相关的文件Bin交叉开发工具集Include头文件InfoGcc的info文件Lib库文件Man帮助文档Share交叉开发工具和库文件共享的文件表2arm-linux目录结构目录名内容Bin和glibc相关的target二进制文件和脚本Etc这里只有rpc文件Include头文件InfoGlibc的info文件LibTarget的库文件Libexec这里只有pt_chownSbinTarget中的/sbin目录Share和国际化相关的子目录,文件Sys-include这里存放glibc没有安装的头文件,由gcc脚本复制4.1下载crosstool-ngcrosstool-ng的下载地址为/download/crosstool-ng,目前最高版本为1.9.3。需要注意的是,在下载完crosstool-ng之后,需要在http:///download/crosstool-ng/01-fixes/中查看一下是否有相应版本的补丁,如果有就一并下载下来。4.2安装所必须的工具文件用crosstool-ng构建交叉编译环境,需要安装所必备的工具文件,否则在编译过程中会产生错误。这些工具文件包括:bison、flex、texinfo、automake、libtool、patch、gcj、cvs、cvsd、gawk。安装的方法在Ubuntu环境下比较简单,在联网的环境下,只需要在终端输入$sudoapt-getinstallxxx并输入密码就可以了。4.3安装crosstool-ng将下载的crosstool-ng-1.9.3.tar.bz2文件进行解压,笔者解压的目录为/home/crosstool-ng,解压好的文件夹为crosstool-ng-1.9.3。如果存在补丁文件,则需要在此目录中运行patch-p1<"补丁文件"之后在crosstool-ng文件夹下新建install安装目录并在终端中执行:1)配置sudo./configure–prefix=/home/crosstool-ng/install2)编译sudomake3)安装sudomakeinstall4.4复制交叉编译文件生成交叉编译工具之前,需要准备配置文件。可以复制对于ARM环境编译的配置文件到安装目录,这个配置文件在sample目录下。在终端执行:cp/home/crosstool-ng/crosstool-ng-1.9.3/samples/arm-unknown-linux-gnueabi/*/home/crosstool-ng/install/bin4.5配置交叉编译工具链复制好构建交叉编译工具所需的配置文件之后,还需对其进行环境设置。进入安装目录cd/home/crosstool-ng/install/bin,执行sudo./ct-ngmenuconfig1)下载编译所需源码包并设置路径在随后的编译过程中,需要一系列的软件包,程序在执行过程中如果在本地磁盘找不到这些软件包,会自动去网上下载,但是会放慢整个编译过程。通过查看crosstool/install/bin目录下的.config文件,可以得知所必需的软件包。通过预先下载这些软件包并存放在本地磁盘上,可以大大加快编译速度。具体的软件在此不具体列出,读者可以自行分析。在该文中在crosstool下新建目录src并将下载下来的软件包存放于此。修改源码包的下载路径,在该文中修改为/home/crosstool-ng/src2)修改交叉编辑安装路径交叉编译器的安装位置,在该文中修改为/home/crosstool-ng/build3)修改交叉编译体系对于ARM处理器来说,由于其不同的体系结构、地址空间和指令位数,因此在编译器上并不相同。对于S3C2410/S3C2440处理器芯片来说,核心是arm920t;而对于S3C6410来说,用的是armv6的框架,因此需要选择armv6。对于不同的处理器芯片,首先查询芯片手册得到其处理器结构框架。该文以S3C2440为例,在Targetoptions>下,进行如下选择:(armv4t)Architecturelevel(arm9tdmi)EmitassemblyforCPU(arm920t)TuneforCPU4)内核源码版本修改确定编译系统的Linux内核版本。该文的Linux内核为5。在install/bin目录下,修改.config文件.修改其中的内核版本。CT_KERNEL_VERSION=修改为CT_KERNEL_VERSION=5CT_KERNEL_V_2_6_33_7=y修改为CT_KERNEL_V_2_6_32_15=yCT_LIBC_GLIBC_MIN_KERNEL=修改为CT_LIBC_GLIBC_MIN_KERNEL=5其它选项不需要改变,保存之后退出就可以了。5)一些个性化设置在Toolchainoptions>选项中修改为:(liueg)Tuple’svendorstring这样生成的编译器前缀就是:arm-liueg-linux-gnueabi-。这一步也可以省略,则生成的编译器前缀就是:arm-none-linuxgnueabi-。4.6编译工具链在终端中执行sudo./home/crosstool-ng/install/bin/ct-ngbuild,经过漫长的等待之后,crosstool-ng会经历软件包解压,配置,编译,链接,大概需要两个小时之后,如果没有提示错误,就可以得到相应的工具链了。4.7增加环境变量环境变量是一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如path,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。$sudogedit/etc/environment在path中添加/home/crosstool-ng/build/bin目录,保存后退出。接着在终端执行:$source/etc/environment此时在终端输入arm-liueg-linux-gcc-v,就可以得到生成的交叉编译工具的版本,该文生成的版本为4.3.2,如图2所示{classCClientSocketclientsocket;//监听套接字CStringclientaddress;//客户端IP地址intclientright;//客户端权限structclientlist*next;}CLIENTLIST;②PACKAGE这是一个用于交换信息的自定义数据包结构体,其定义如下:typedefenum{disconnect,message,response,closecomputer,filepackage,renamefile,removefile,downloadfile,uploadfile,renamedirectory,removedirectory,getdirectory,createdirectory}PACKAGESTYLE;typedefstruct{PACKAGESTYLEpackagestyle;//该枚举类型用以表示本数据包包含信息的类型charsender[16];//数据包的发送方charreceiver[16];//数据包的接收方charpackagemessage[512];//数据包基本信息charpackageappendix[256];//数据包扩展信息ULONGLONGfilesize;//发送文件的长度UINTfileindex;//发送文件的编号,用于今后客户端和服务器之间多文件通讯charfilecontent[5120];//文件数据包内容}PACKAGE;图2该方法总结:用crosstool-ng构建Linux操作系统下交叉编译工具,脚本会自动完成Linux环境下头文件、库文件、内核版本和交叉编译工具链的匹配问题,方法简单易行,也不容易出错。由于其是一个开源软件,目前仍在不断维护过程中,如果遇到更高版本的Linux
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年来宾市合山生态环境局招聘备考题库及参考答案详解1套
- 会议发言与讨论规范制度
- 2026年石狮市部分公办学校赴西南大学公开招聘编制内新任教师52人备考题库附答案详解
- 2026年黑旋风锯业股份有限公司招聘备考题库及答案详解参考
- 2026年香山社区卫生服务中心招聘备考题库及完整答案详解1套
- 中学学生社团活动经费管理监督制度
- 2026年石狮市部分公办学校赴西南大学公开招聘编制内新任教师52人备考题库及答案详解参考
- 2026年罗甸县第二医共体逢亭分院面向社会公开招聘编制外卫生专业技术人员备考题库完整参考答案详解
- 咸宁市第一高级中学2026年专项校园公开招聘教师30人备考题库及一套完整答案详解
- 2026年阿里地区精神卫生福利院招聘生活护理员的备考题库及答案详解参考
- 酒吧消防安培训
- 养老院消防培训方案2025年课件
- Smaart7产品使用说明手册
- 烟站述职报告(4篇)
- 盖州市水务有限责任公司2025年工作总结暨2026年工作计划
- 幼儿园老师面试高分技巧
- 瓷砖工程验收课程
- 难治性癌痛护理
- 2026年管线钢市场调研报告
- 中医内科学考试题库及答案(二)
- 2025年江苏省公务员面试模拟题及答案
评论
0/150
提交评论