




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计说明书ARM-Linux交叉编译环境的创建毕业设计中文摘要ARM-Linux交叉编译环境的创建摘要:交叉编译就是在一个平台生成可以在另一个平台执行的代码,它作为嵌入式系统开发的前提和准备,具有相当重要的作用,嵌入式系统的可执行文件都是通过交叉编译生成的。本文详细介绍了建立嵌入式交叉编译环境的具体步骤,通过分步编译Binutils、GCC、glibc 和GDB,最终成功完成了基于ARM-Linux 的交叉编译环境的建立,并成功通过测试。在本设计中还列举了用crosstool-ng 构建交叉编译工具链的方法,这个方法比前一种简单,而且比较快捷。这两种方法制作的交叉编译环境都具有高度的可靠性和稳定性,并且具有较好的实用价值。关键词: 嵌入式linux arm 交叉编译环境 gcc毕业设计外文摘要Title The establishment of ARM-Linux cross-compiling environmentAbstractCross-compiling means the compiler and running of program are depended on different platforms, codes generated on one platform can run on another. As the premise and basis for exploiting embedded systems, Cross-compiling is of great importance for almost all embedded executable files are generated through this approach. Specifics on how to establish a cross-compiling environment are introduced in this thesis. Through compiling Binutils, GCC, glibc and GDB, etc, an ARM-Linux cross-compiler is successfully created and proved to be correct. Another method using crosstool-ng is also included, which is more simple and convenient than the former. ARM-Linux cross-compilers based on two methods are both of high reliability and stability, as well as good practical values.Keywords: embedded-Linux arm cross-compiling environment GCC目 次1 引言21.1课题研究的目的意义21.2 课题历史背景31.3 开发方案的选择62 了解嵌入式开发72.1 Linux常用命令72.1.1文件目录类72.1.2驱动挂载类82.1.3压缩解压类82.1.4 源代码包安装82.1.5 进程控制类92.1.6 用户帐号类92.1.7 网络服务92.2 GCC包括的工具。92.3交叉调试概念103.分步编译安装源代码与库文件方法113.1创建编译环境123.1.1首先设置环境变量:123.1.2创建相关目录123.1.3安装linux头文件123.2编译binutils133.3编译bootstrap-gcc143.4编译Glibc153.5编译完整Gcc173.6编译GDB184 用crosstool-ng 构建交叉编译工具链194.1 下载crosstool-ng204.2 安装所必须的工具文件204.3 安装crosstool-ng214.4 复制交叉编译文件214.5 配置交叉编译工具链214.6 编译工具链224.7 增加环境变量23结 论25参 考 文 献26致 谢271 引言1.1课题研究的目的意义嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应的要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。像我们平常常见到的手机、PDA、电子字典、可视电话、VCD/DVD/MP3 Player、数字相机(DC)、数字摄像机(DV)、U-Disk、机顶盒(Set Top Box)、高清电视(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的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法 的难易程度以及识别它们所需要的算法来对语言分类。正如现在所称的Chomsky架构(Chomsky Hierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关 文法)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsing problem,用于上下文无关文法识别的有效算法)的研究是在60年代和70年代,它相当完善的解决了这个问题。现在它已是编译原理中的一个标准部分。 有限状态自动机(Finite Automation)和正则表达式(Regular Expression)同上下文无关文法紧密相关,它们与Chomsky的3型文法相对应。对它们的研究与Chomsky的研究几乎同时开始,并且引出了 表示程序设计语言的单词的符号方式。 人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常 将其称为优化技术(Optimization Technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(Code Improvement Technique)。 当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构 造。这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器(Parser Generator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是Yacc(Yet Another Compiler-compiler),它是由Steve Johnson在1975年为Unix系统编写的。类似的,有限状态自动机的研究也发展了一种称为扫描程序生成器(Scanner Generator)的工具,Lex(与Yacc同时,由Mike Lesk为Unix系统开发)是这其中的佼佼者。 在20世纪70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。 编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中 的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器 已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进 行开发已成为方向。另一方面,尽管近年来在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变,它现在正迅速地成为计 算机科学课程中的中心环节。 在20世纪90年代,作为GNU项目或其它开放源代码项目标一部分,许多免费编译器和编译器开发工具被开发出来。这些工具可用来编译所有的计算机程序语言。它们中的一些项目被认为是高质量的,而且对现代编译理论感兴趣的人可以很容易的得到它们的免费源代码。 大约在1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。 简单地说, 就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统 (Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所 需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比 如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C+开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过 程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太 可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的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上查阅资料,一台电脑可以当两台用,确实很方便。在Linux 环境下构建交叉工具链有以下三种方法:1) 分别编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。2) 通过crosstool 或crosstool-ng 脚本工具来实现一次编译,生成交叉编译工具链。3) 直接通过网上下载已经制作好的交叉编译工具链。第一种在执行上比较困难,需要比较清楚地了解每个工具链软件的相互匹配情况,而且也可能会遇到不同的Linux 发行版之间差别的影响,比较容易出错或者编译不通过。第二种方法对linux发行版本要求的不是很严格,编译也比较容易,不易出错,相对简单。第三种方法,去下载网上已经构建好的交叉编译工具链。但是这样做虽然比较简单,但是局限性比较大,经常受到软件版本与内核版本之间不匹配的冲突。通过安装crosstool-ng,复制交叉编译文件,配置交叉编译工具链,编译工具链,增加环境变量,最终制作出适合需要的交叉编译工具。2 了解嵌入式开发2.1 Linux常用命令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 -t auto /dev/cdrom /mnt/cdrom挂载ISO文件:mount -t iso9660 -o loop xxx.iso /path4)umount /mnt/目录名解除挂载(解除所有的挂载:umount -a)5)mkfs建立文件系统2.1.3压缩解压类1) .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName2) .gz 解压1:gunzip FileName.gz;解压2:gzip -d FileName.gz压缩:gzip FileName3) .tar.gz和.tgz解压:tar zxvf FileName.tar.gz压缩:tar zcvf FileName.tar.gz DirName4) .bz2解压1:bzip2 -d FileName.bz2;解压2:bunzip2 FileName.bz2压缩: bzip2 -z FileName5) .tar.bz2解压:tar jxvf FileName.tar.bz2压缩:tar jcvf FileName.tar.bz2 DirName6).tar.bz解压:tar jxvf FileName.tar.bz压缩:未知7).Z解压:uncompress FileName.Z压缩:compress FileName8).zip解压:unzip FileName.zip压缩:zip FileName.zip DirName2.1.4 源代码包安装1) 配置:在解压目录下 ./configure2) 编译:在解压目录下 make3) 安装:在解压目录下 make install2.1.5 进程控制类1) ps -auxw列出当前进程ID;2) kill 进程ID号终止单一进程;3) Killall 程序名终止该程序所有进程;4) xkill终止X-Window程序;5) top查看资源占用情况;6) env查看环境变量的值;7) reboot重启;8) shutdown -h now关机;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 -k start|stop启动或终止web服务4) ping xxx.xxx.xxx.xxx查看网络状况,联机状况:ping -dfnqrRv-c-i-l-p-s-t主机名称或IP地址2.2 GCC包括的工具。1)cpp GNU预处理器,主要用于扩展用户源程序的头文件和宏定义。cpp是GNU C编译器的预处理器。cpp是一个宏指令处理器,GNU C编译器在编译前自动使用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)As GNU汇编器(Assemble),主要用于把汇编代码转换成二进制代码,并存放到一个object文件中。6)Ld GNU链接器(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-2.16.tar.bz2Binutils工具包Gcc-3.4.4.tar.bz2Gcc编译器Glibc-2.3.3.tar.bz2Glibc库Glibc-linuxthreads-2.3.3.tar.bz2Glibc套件 Gdb-6.4.tar.bz2调试器Linux-.tar.bz2Linux内核表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首先设置环境变量:#export VBINUTILS=2.16#export VGCC=3.4.4#export VGLIBC=2.3.3#export VGLIBCTHREADS=2.3.3#export VGDB=6.4#export VLinuxKERNEL=#export PREFIX=/usr/local#export HOST=i686-pc-linux-gnu#export ARCH=arm#export TARGET=arm-linux#export TDIR=/usr/src/tars#export SDIR=/usr/src/source#export BDIR=/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#tar zxvj $TDIR/linux-$VLinuxKERNEL.tar.bz23.1.4使用ARM平台的库文件。创建相关链接。#cd linux$VLinuxKERNEL/include/asm-arm#rm f arch proc#ln s arch s3c2410 arch#ln s arch s3c2410 arch#ln s proc armv proc#cd ././3.2编译binutils首先要安装的软件包是binutils,这步非常重要,Glibc和gcc会针对可用的连接器和汇编器进行多种测试,来决定打开某些特性。解压binutils软件包:#cd $SDIR#tar xvfj $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#make install#chmod 777 $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文件。#just for these,we omit the frame pointer since it makes such a big#difference. It is then pointless adding debuggingTARGET_LIBGCC2_CFLAGS=-pomit-frame-pointer-fPIC-Dinhibit_libc-D_gthr_posixLIBGCC2_DEBUG_CFLAGS=-g0#dont build enquireENQUIRE=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-float soft-float#EXTRA_MULTILIB_PARTS=crtbegin.o crtend.oMULTILIB_OPTIONS=mlittle-endian/mbig-endian mhard-float/msoft-floatMULTILIB_DIRNAMES=le be hard-float soft-floatEXTRA_MULTILIB_PARTS=crtbegin.o crtbeginS.o crtend.o crtendS.o crti.o crtn.oLIBGCC=stmp-multilibINSTALL-LIBGCC=install-multilibT_CFLAGS=-Dinhibit_libc D_gthr_posix_h#LIBGCC=stmp-multilib#INSTALL_LIBGCC=install-multilib#Assemble startup files.$(T)crti.o:$(srcdir)/config/arm/crti.asm$(GCC_PASSES)$(GCC_FOR_TARGET)$(GCC-CFLAGS)$(MULTILIB_CFLAGS)$(INCLUDES) -c o$(T)crti.o x assembler-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 x assembler-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#tar xvfj$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#make install3.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#tar xvfz$TDIR/glibc-$VGLIBC.tar.gz#cd $SDIR/glibc-$VGLIBC#rm rf nptl#tar xvfz $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。然后还要创建一个文件:#touch sysdeps/arm/framestate.c然后开始编译工作:#cd $BDIR/glibc#CC=”arm-linux-gccmbig-endianfinline-limit=10000”AS=”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#make install3.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源代码目录中执行下面命令即可。Perlpies/intnamelen/unsignedintnamelen/ libjava/java/net/natLnetAddressPosix.cc然后开始编译#cd $BDIR#rm rf gcc#mkdir gcc#$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#make install3.6编译GDBGUN的GDB是一款非常强大的调试器。如果要调试的是ARM的可执行代码,需要交叉编译后的GDB。#cd $SDIR#tar xvfj$TDIR/gdb-VGDB.tar.bz2#cd $BDIR/gdb#$VGDB/configure build=$HOST-target=$TARGET-perfix=$PREFIX#make#make install编译完成,下面是各目录作用:$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脚本复制表34 用crosstool-ng 构建交叉编译工具链Crosstool 是由美国
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三国演义课件
- 三只小猪绘画表演课件
- 三创知识培训过程课件
- 行政支持岗位面试攻略:经典题目与应对策略
- 求职者必答:集体中毒面试经典问题及答案精 编
- 三军仪仗队课件
- 求职新锐:金融招聘面试必 备:万联证券面试题库精 编集
- 大班迷路的小花鸭教案
- 大班体育游戏《勇敢的奥特曼》活动策划方案
- 大学生暑期社会实践策划方案
- 《异常子宫出血诊断与治疗指南(2022更新版)》解读
- 《不同电针参数剌激安眠穴对原发性失眠患者睡眠质量干预作用的临床研究》
- 工程各工种及机械设备安全操作规程
- 《班主任教育案例》课件
- 低钠血症的中国专家共识2023解读
- 跨界融合与个性化护肤
- 中医艾灸养生护理
- 2025届湖南省长沙市一中物理高一上期中达标检测模拟试题含解析
- 工程施工重点、难点分析及保证措施
- 2024城市电缆线路岩土工程勘察规范
- 变电站巡检维护服务方案
评论
0/150
提交评论