(计算机应用技术专业论文)交叉编译和交叉调试工具的研究与实现.pdf_第1页
(计算机应用技术专业论文)交叉编译和交叉调试工具的研究与实现.pdf_第2页
(计算机应用技术专业论文)交叉编译和交叉调试工具的研究与实现.pdf_第3页
(计算机应用技术专业论文)交叉编译和交叉调试工具的研究与实现.pdf_第4页
(计算机应用技术专业论文)交叉编译和交叉调试工具的研究与实现.pdf_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 摘要 随着嵌入式系统的飞速发展,嵌入式系统开发工具在开发过程中所起的作用 日益突出,相关的研究、技术也随之不断更新。嵌入式系统开发工具包括嵌入式 硬件开发工具和嵌入式软件开发工具。其中在嵌入式软件开发工具中,使用的晟 多的工具就是交叉编译器和交叉调试器,同时这两者也是嵌入式软件开发工具的 最核心部分。本文讨论的就是嵌入式软件开发工具中的交叉编译器和交叉调试器。 论文首先阐述了交叉编译和交叉调试的概念,简要说明了嵌入式软件的开发 过程,介绍了系统级调试和任务级调试的概念,比较了它们之间的区别;接着对 g c c 编译器主要组成部分进行了详细的分析;随即对交叉调试的核,f i , 技术进行了 分析;之后阐述了g d b 交叉调试器和远程串行协议并引入了调试代理的概念,分 别研究、分析了两种调试代理的技术实现途径和方法。最后,详细的说明了如何 将交叉编译工具和交叉调试工具移植到w i n d o w s 平台上,设计并实现了两种调试 代理。 所完成的交叉编泽器和交叉调试器作为一个重要的系统开发工具,成功应用 于云南省科技厅的项目上。 嵌入式开发研究领域正在向实时、分布式、s o c 等方向发展,对交叉编译和 交叉调试技术提出了很多新的研究问题和方向。由于交叉编译器和交叉调试器的 复杂程度高、体系庞大、实现难度较大等,仍有上述部分研究领域无暇涉及,希 望后续研究能够在上述方面深入下去。 关键词:交叉编译器交叉调试器调试代理嵌入式l i n u x g n u a b s t r a e 善 a b s t r a c t w h i l ee m b e d d e dt e c h n o l o g yd e v e l o p s r a p i d l y , e m b e d d e d s y s t e md e v e l o p m e n t t o o l k i ti sas p e c i a li m p o r t a n tc o m p o n e n ti nt h ee m b e d d e ds y s t e md e v e l o p m e n t ,i nw h i c h n e ws t u d ya n dt e c h n o l o g yu p d a t ec o n t i n u o u s l y , w h i c hi n c l u d e sh a r d w a r ed e v e l o p m e n t t o o l sa n ds o f t w a r ed e v e l o p m e n tt o o l s t h ec o r ei nt h et o o l k i tu s e dm o s tp o p u l a ra r e c r o s sc o m p i l e ra n dc r o s sd e b u g g er i ti sd i s c u s s e di nt h i st h e s i st h a t u s eo fc r o s s c o m p i l e ra n dc r o s sd e b u g g e r 证e m b e d d e ds y s t e ms o f t w a r ed e v e l o p m e n t t o o l k i t i nt h i s t h e s i s ,t h ec o n c e p t i o no f c r o s sd e b u g g i n ga n dc r o s sc o m p i l i n ga r e i n t r o d u c e d ,a n dt h ep r o c e s so f e m b e d d e ds o f t w a r ed e v e l o p m e n ti s e x p l a i n e d ,t h e c o n c e p t i o no fs y s t e m - l e v e ld e b u g g i n ga n dt a s k - l e v e ld e b u g g i n ga r ed i s c u s s e da l s o , d i f f e n c eb e t w e e nw h i c hi si n t r o d u c e d ,t h e nt h em a i nc o m p o n e n to fg c cc o m p i l e ra n d t h ec o r et e c h n o l o g yo fc r o s sd e b u g g i n ga r ea n a l y z e di nd e t a i l 。c o n c e p t i o no fd e b u g g i n g a g e n ti si n t r o d u c e db a s e do nt h er e s e a r c ho fg d b c r o s sd e b u g g e ra n dr e m o t es e r i a l p r o t o c 0 1 t w ot y p e so fm e t h o da c h i v i n gd e b u g g i n ga g e n tt e c h n o l o g ya r es t u d i e da n d a n a l y z e d f i n a l l y , t h ep a p e rf o c u s e s o nh o wt o p o r tc r o s s - c o m p i l e t o o l k i ta n d c r o s s d e b u gt o o l k i ti n t ow i n d o w so p e r a t i o ns y s t e m ,a n dd e s i g n i n ga n dr e a l i z i n go ft h e t w ot y p e so fd e b u g g i n ga g e n ta r ea c c o m p l i s h e d 。 t h ec r o s sd e b u g g e ra n dc r o s sc o m p t i e ri n t h i st h e s i sa r et w oi m p o r t a n t d e v e l o p m e n tt o o l k i t si nt h ep r o j e c to f y u n n a n p r o v i n c et e c h n o l o g yh a l l t h e r ea r em a n yp r o b l e m si ne m b e d d e ds y s t e md e v e l o p m e n tf i e l d s ,s u c ha st h e r e a l - t i m es y s t e m s ,d i s t r i b u t e ds y s t e m sa n ds o c w h i c hp r e s e n tm a n yn e wr e s e a c h d i r e c t i o n so fc r o s sc o m p i l i n ga n dc r o s sd e b u g g i n g f o rr e a s o n so fh u g e n e s sa n dh i 【曲 d i f f i c u l t yi nr e a l i z i n go ft h es y s t e m ,t h e r ea r ed o m a i n sn o tr e s e a c h e di nc r o s s c o m p i l e a n dc r o s s d e b u gi nt h i st h e s i s 。i ti sh o p e dt h a tt h e r ea l el u t h e rs t u d yi nf i e l dm e n t i o n e d a b o v e k e yw o r d s :c r o s sc o m p i l e r ,c r o s sd e b u g g e r ,d e b u g g i n ga g e n t ,e m b e d e dl i n u x , g n u n 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工 作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地 方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含 为获得电子科技大学或其它教育机构的学位或证书而使用过的材料。 与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明 确的说明并表示谢意。: 签名:巡日期:方够年j 一月钼 关于论文使用授权的说明 本学位论文作者完全了解电子科技大学有关保留、使用学位论文 的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁 盘,允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文 的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或 扫描等复制手段保存、汇编学位论文。 ( 保密的学位论文在解密后应遵守此规定) 签名:鱼整丝导师签名:垄翔 e i 期:阳占年r 胪日 第一章绪言 1 1 基本概念和术语 第一章绪言 伴随着以计算机技术、通讯技术为主的信息技术的飞速发展和互联网的广泛应 用,信息家电,手持设备,移动设备等嵌入式产品的迅速发展,使得嵌入式产品 再度成为一个研究热点。 各种嵌入式设备都具有功能专一、针对性强的特点。因为其硬件资源不会象 p c 机一样丰富,所以要在嵌入式设备上建立一套开发系统是不现实的。在开发嵌 入式系统时,通常都采用交叉开发( c r o s sd e v e l o p p i n g ) 的模式,即:开发系统是 建立在硬件资源丰富的p c 机( 或者工作站) 上,通常称其为宿主机( h o s t ) ,应 用程序的编辑,编译,链接等过程都是在 1 0 s t 上完成的;而应用程序的最终运行 平台却是和h o s t 有很大差别的嵌入式设备,通常称其为目标机( t a r g e t ) ;调试在 二者问联机交互进行。这里二者的“差别”主要是指: 1 1 硬件上差别很大。通常c p u 的类型都不同。例如:h o s t 的c p u 为i n t e l p e n t i u mi v 芯片,而t a r g e t 为a r m 芯片或m 1 p s 芯片; 2 1 软件环境的差异。在h o s t 上有通用o s ( o p e r a t i n gs y s t e m ) 的支持( 如: w i n d o w s 、l i n u x 、u n i x 等) ,而t a r g e t 一般都是裸机,没有任何的软件资 源,或者运行专用的嵌入式操作系统。通常情况下,现有的目标机o s 是 用于对嵌入式应用的支撑而不是用于目标机的开发环境平台。 因此,基于上述交叉开发模式的开发系统被称为嵌入式交叉开发系统,它一般 主要包括: 1 、交叉编译工具:在宿主机上,能够将一个源程序编译生成为一个可执行程 序的软件,这个可执行程序能够在目标机上执行。 2 1 交叉调试工具:在宿主机上能对目标机上的可执行程序进行源码或汇编级 调试的软件。 1 1 1 交叉编译概念 产生的程序运行于不同于本系统的编译器称为交叉编译器( c f o s sc o m p i l e r ) 。 电子科技大学硕士学位论文 相似的,其他的交叉汇编器,交叉链接器也是同样的概念。在正常的情况下,一 个编译器产生的代码一般运行在编译器所在的系统,为了区分这种编译器和上面 的不同,这种编译器称为本地编译器( n a t i v ec o m p i l e r ) 。尽管调试器不能严格的 称为编译工具,但我们经常也要提到交叉调试器,交叉调试器是调试运行其他系 统的调试器。 在过去的几年中,g c c ( g n uc o m p i l ec o l l e c t i o n ) 工具链【1 1 因为其免费、开源、 功能强大、支持大多数的体系结构的特点,并可以支持c 、c + + 、a d a 、o b j e c tc 、 j a v a 、f o r t r a n 、p a s c a l 等多种高级语言,从一个默默无闻的编译工具变成了开 发众多1 6 位和3 2 位嵌入式处理器的精选工具。g c c 主要包括如下一些工具。 1 ) c p pg n u 预处理器,主要用于扩展用户源程序的头文件和宏定义。c p p 是g n uc 编泽器的预处理器。c p p 是一个宏指令处理器,g n uc 编译 器在编译前自动使用c p p 对用户程序进行转换。c p p 之所以称为宏指令 处理器是因为它允许用户定义宏指令( 长结构的简写) 。 2 1g c c符合i s o 等标准的c 编译器。 3 ) g + +基本符合i s o 等标准的c + + 编泽器。 4 ) b i n u t i l s 是一组二进制工具程序集,它包括a d d r 2 1 i n e 、a r 、a s 、g p r o f 、 l d 、r l i i 、o b j c o p y 、o b j d u m p 、r a n l i b 、s i z e 、s t r i n g s 、s t r i p 等工具。是辅助 g c c 的主要软件。 5 ) a sg n u 汇编器( a s s e m b l e ) ,主要用于把汇编代码转换成二进制 代码,并存放到一个o b i e c t 文件中。 6 ) l d g n u 链接器( l i n k e r ) ,主要用于确定相对地址,把多个o b j e c t 文件、起始( s t a r t u p ) 代码段、库( l i b r a r y ) 等链接起来,并最终形成 一个可执行文件。 7 1a d d r 2 1 i n e 把可执行程序中的地址映射到源文件的对应行。 8 ) a r 创建归档文件( a r c h i v e ) 。修改替换掉库中的o b j e c t 文件。向 库中添加提取o b j e c t 文件。 9 1c + + f i l e 解码c + + 符号名。 1 0 ) n m列出o b i e c t 文件中的符号。 1 1 ) o b j c o p y 用来显示对象文件的信息。 1 2 ) r a n l i b 根据归档文件( a r c h i v e ) q h 内容建立索引。 2 第一章绪言 1 3 1r e a d e l f显示o b j e c t 文件和执行文件各节( s e c t i o n ) 和总的大小。 1 4 1s t r i n g s显示文件中可以打印的字符。 1 5 ) s t r i p去掉执行文件中多余的信息( 如调试信息等) ,可减少执行文 件的大小。 下面介绍一些交叉编译工具基本概念。 1 主机和目标机 当构建交叉编译工具时,涉及到两个系统:工具所运行的系统,工具产生代 码所运行的系统。 工具所运行的系统称为:本机系统( h o s ts y s t e m ) ; 工具产生的代码所运行系统称为:目标系统( t a r g e ts y s t e m ) 。 例如有运行在g n u 1 i n u x 系统的编译器,此编译器如果产生运行在m i p s 嵌入 式系统的e l f 程序,在这种情况下,g n u 1 i n u x 为主机系统,m i p s 系统为目标系 统。运行在g n u l i n u x 系统的编译器称为基于g n u 1 i n u x 的交叉m i p s 编译器。在 很多情况下,许多工具不是交叉编译工具,因此对于这些工具没有必要讲目标机 的概念,如m a k e ,b i s o n 等工具并没有目标机的概念,因此也不会听说有交叉m a k e , 交叉b i s o n 。多数的交叉编译工具也可以做为本机工具( n a t i v et 0 0 1 ) ,只不过此 时将目标类型配置为与本机相同的配置。 2 主机类型 在构建交叉编译工具时,一般要运行在主机端的配置脚本c o n f i g u r e 。在配置 脚本中与主机相关的比较重要的宏定义如下: h o s t :规范的主机名,通过运行e o n f i g g u e s s 脚本来决定,不过用户可在配 置命令中通过显示的一h o s t 的选项来重新指定。 h o s t a l i a s :在配置中如果显示的使用一h o s t 选项,则h o s t a l i a s 作为此选 项的参数。一般情况下,h o s t a l i a s 与h o s t 相同的。 h o s t c p u :主机系统的处理器类型。 h o s tv e n d o r :主机系统的生产厂商。 h o s t o s :主机系统采用的操作系统。 3 目标的指定 默认情况下,在c o n f i g u r e 配置脚本中将目标( t a r g e t ) 指定的与主机是一 电子科技大学硕士学位论文 样的。这种情况下,相应的编译器就是本地编译器而不是交叉编译器。如果想构 建交叉编译器,在运行c o n f i g u r e 时通过一t a r g e t 选项来显示的指定目标,一t a r g e t 是指定产生代码所运行的系统的配置名。例如,如果想构建运行在m i p s 系统的交 叉编译器,则目标类型可以指定为一t a r g e t = m i p se l f 。 4 目标的类型 同主机的类型一样,与目标机相关的宏有如下几个: t a r g e t ,t a r g e t a l i a s ,t a r g e t c p u ,t a r g e t v e n d o r ,t a r g e t o s 等 一般,交叉工具的配萱是通过一t a r g e t 指定的选项作为交叉: 具的前缀,如果 用户不使用一t a r g e t 选项,则生成的是本地工具。例如,在配置g c c 时,如果 一t a r g e :m i p s e l f 则生存的交叉:】:具的名字为m i p s e l f g c c 。如果没有一t a r g e t 选 项,则生成的工具的名字就是g c c 。 5 主机库和目标库 在构建本地编译器时一般要用到主机库,这些主机库包括b f d ,t e l 等,当 在主机运行g c c ,b i n u t i l s 等程序时,这些库被链接到这些程序。 在构建目标编译器时一般需要一些目标库的支持,这些目标库包括n e w l i b , 1i b s t d c + + 等,在配置交叉编译工具时,它们被链接到目标编译工具中。 现在很多嵌入式系统的调试开发工具链都采用的是g n u 的工具链,通过这些 工具链来配置交叉工具。 1 1 2 交叉编译的步骤 采用交叉编译,一般需要以下步骤: 1 ) 在主机端运行交叉编译器产生目标机的编译文件,在这个过程,需要与 目标机相关的头文件。 2 ) 汇编交叉编译产生的文件,此时的汇编器要么是在运行目标机的汇编器 或者在主机端的交叉汇编器。 3 ) 链接在第二步生成的汇编文件生成可执行文件,此时的链接器可以是目 标机的链接器或者在主机端的交叉链接器,无论是在目标端或者主机端, 在链接过程中,需要一些支持目标机的库或者启动文件f 常见的如c r t o 等) 4 第一章绪言 1 2 交叉调试概念 在开发嵌入式应用软件时,交叉调试是必不可少的一步。嵌入式应用的特点 决定了其调试具有如下的特点: 1 1 调试器( d e b u g g e r ) 和被调试程序( d e b u g g e e ) 运行在不同的计算机上。 d e b u g g e r 运行在一般的p c 机或者工作站上( 即h o s t 上) ,而d e b u g g e e 运行在实际的某种嵌入式设各或者专业的评估板上( 都被称为t a r g e t ) 。 2 1d e b u g g e r 通过某种通信方式与目标机建立联系。通信方式可以是串口、 并口、网络、或者专用的通信方式。 3 1 一般在目标机上有d e b u g g e r 的某种代l 望_ ( a g e n t ) ,这种代理能与d e b u g g e r 一起配合完成对目标机上运行的程序的调试。这种代理可以是某种软件, 也可以是某种支持调试的硬件等。 4 1 目标机也可以是一种虚拟机。在这种情形下,似乎d e b u g g e r 和d e b u g g e e 运行在了同一台计算机。但是调试方式的本质没有变化,即d e b u g g e e 都是被下载到了目标机,对d e b u g g e e 的调试并不是直接通过h o s t 的操 作系统的调试支持来完成的,而是通过虚拟机代理的方式来完成调试。 因此交叉调试可以这样定义:调试器能够通过某种方式( 远程) 控制目标机 上被调试程序的运行模式,并且具备查看和修改目标机上的内存、寄存器以及被 调试程序中的变量等功能【2 】 1 。 下面将交叉调试( c r o s s d e b u g g i n g ) 和非交叉调试( n a t i v ed e b u g g i n g ) 做一 比较: 表1 - 1 交叉调试与非交叉调试的比较 交叉调试本地调试 d e b u g g e r 和d e b u g g e e 运行在不同的计算机d e b u g g e r 和d e b u g g e e 运行在同一台计算机 运行时不一定需要操作系统的凋试支持运行日寸需要操作系统的调试支持 d e b u g g e e 装载由d e b u g g e r 或l o a d e r 完成 d e b u g g e e 的装载是由专门的l o a d e r 程序完成 需要通过外部通信的方式来控制d e b u g g e e不需要外部的通信方式来控制d e b u g g e e 可咀直接凋试不同指令集的程序 只能直接调试相同指令集的程序 堕量登! 蔓奎堂塑主堂垡堡壅 1 3 系统级调试和任务级调试 1 3 1 系统级调试的概念,原理 在这种调试方式下,运行在目标机方除了调试代理外的所有程序,都属于调 试范围,是被调试程序。用户不能自定义调试范围。在调试范围内的所有程序地 位相等,不能识别操作系统本身和运行在操作系统之上的任务。这种调试方式可 以用于调试操作系统、 s r 、l n u x 的可加载模块或是一些简单的不需要操作系统 支持的用户程序。调试方与被调试之间的关系可以通过图卜l 表示出来: 生忙蠢 c 裂竺! 罗 1 3 2 任务级调试的概念,原理 任务级调试相对于系统级调试的,我们可以从其概念与原理上来区别其与系 统级调试的不同之处。 嗍试代理 任务 :嚣俨: 、 l 。一,口试范目、 ,调试范围、操作系统调外的任务 、内的任务度这部分任 l 芦、一 淤i 刷嚣: 篡巍i :f 太:系统飞黧: 唤醒调试代理任 务处理。 笋竺翌歹产8 ” ,、园i - 2 任务级调试原理图1 l 这种调试方式是在操作系统的支持卞实现调式,工作的,操作系统不属干j 周试 第一章绪言 范围,调试范围是一个任务( 集) 。用户可以自定义调试范围,并可以在调试过程 中添加或删除调试范围中的任务。这种调试方式调试范围灵活可控,能提供针对 任务的特殊调试功能,适用于调试多任务的复杂用户程序。 在任务级调试下,调试代理与被调试的任务以及不是被调试的任务被操作系 统调度之间的关系见图1 2 。 1 4 本文的研究背景 嵌入式系统开发当前正处于一种飞速发展阶段,国内外众多的科研机构、著 名公司都纷纷进入该领域。鉴于交叉开发过程在嵌入式系统开发中的重要地位, 针对嵌入式系统设计的工具开发平台就更现其重要性。国内目前在系统工具方面 的研究较少,嵌入式系统生产厂商也大部分停留在利用国外开发平台开发应用的 阶段,因此,设计构造如交叉编译器、交叉调试器等嵌入式开发工具就是一个迫 切而重要的课题。对开发工具的研究( 包括交叉编译器、调试器、虚拟机等) ,可 以打破长期阱来国外公司在该领域的垄断地位,对嵌入式开发而言意义重大。 l i n u x 作为一个源码开放,并且集通用、嵌入式兼容的操作系统,其本身良好 的设计就让全世界对其刮目相看,在嵌入式领域,l i n u x 也越来越多的占据了市场 分额,其开放的源码也让我们有机会探询操作系统实现,做出合适的改造。可以 这样说,l i n u x 及相应的工具为我们研究、构造嵌入式系统提供了多种选择。 本论文的研究工作是在云南科技厅项目基础上完成的。该项目目的是针对远 程环境监控系统的开发搭建一个嵌入式l i n u x 平台,使用a r m 处理器,把裁减后 的l i n u x 内核作为嵌入式操作系统。平台除了提供内核,还提供w i n d o w s 平台下 的集成开发环境,其中包括嵌入式交叉开发工具,如交叉编译器、交叉调试器; 同时提供配置管理器,编辑器和版本控制系统,使得开发者在开发过程中以友好 的图形界面能够以可剪裁、可配置的方式对产品进行设计开发。交叉编译器和交 叉调试器是该平台开发工具中的重要组成部分,为设计者提供了一个易于操作、 方便使用的开发平台。 1 5 本文的研究内容 本论文对交叉编译和交叉调试技术进行深入的分析与了解,针对基于嵌入式 操作系统的交叉编译器和交叉调试器进行了深入的研究,并在此基础之上提出了 电子科技大学硕士学位论文 自己的观点与看法,且并在研究的基础上实现了i d e 环境下的交叉编译和交叉调 试工具。研究内容包括: 1 阅读大量的代码与文档,分析编译器和调试器,对编译器和调试器的体系结构, 对两者工作原理、核心技术实现有了深入理解。并通过举例子让读者知道两者 是怎么样运用这些关键技术的。也对今后进一步研究,如增强调试器实时特性、 分布式特性有重要指导意义,该部分是论文的理论基础; 2 分析了g c c 编译器和g d b 调试器的工作原理,分析比较了几种常用交叉调试模 式,对调试代理进行分类。 3 在w i n 3 2 下设计实现了针对嵌入式l i n u x 系统、a r m 9 平台的交叉编译工具; 4 在w i n 3 2 下设计实现了针对嵌入式l i n u x 系统、a r m 9 平台的任务级的交叉调 试工具; 5 设计实现了针对a r i f l 9 平台的系统级的交叉调试工具; 1 6 论文的章节安排 第一章绪论:该章介绍了交叉编译和交叉调试的概念,比较了交叉调试和本 地调试的不同,简述了系统级调试和任务级调试,以及本文的研究背 景; 第二章g c c 编译器的分析:该章对g c c 的结构,流程以及不同的流程阶段 涉及模块做一介绍,详细分析了g c c 的编译过程的几个阶段。 第三章嵌入式系统软件调试核心技术:该章指出了软件调试和硬件调试的区 别,简要介绍了几种硬件调试器,详细分析了软件调试器的核心技术。 第四章基于g d b 的交叉调试器:该章简要叙述了g d b 交叉调试的工作原理, 介绍了g d b 远程串行协议,重点分析了两种调试代理的实现过程。 第五章w i n d o w s 环境下交叉编译和交叉调试工具的实现:该章泔c y g w i n 这 个工具作了简要的介绍,详细介绍了如何在w i n d o w s 平台上实现了针 对a r m 9 的交叉编译工具和交叉调试工具,实现了系统级调试和任务 级调试两种方式。 第六章总结:对论文工作进行回顾总结,提出今后进一步研究的方向。 第二章g c c 编译器的分析 第二章g c c 编译器的分析 g c c 是一个用c 语言实现的编译系统。高度的优化和可移植性能是孩编译 系统最为突出的两大特点。它除了保持c 语言家族的简洁、高效及灵活之外,增 加了许多新的语言特征,其中某些特征是从p a s c a l ,c + + 及a d a 语言中吸收来 的,这使得该语言的描述功能更为丰富和更易于编写高效的程序。目前它己成功 地移植到诸如i 3 8 6 、a r m 、m i p s 、s p a r c 及a l p h a 等系列的几十种不同的计算 机平台上,并且其性能较同级的商业软件产品更为稳定和可靠。性能的优化和可 移植性使得该产品越来越受到人们的青睐。 2 1 g c c 的系统结构 幽2 1g c c 输译流拦 g c c 主要是由语法分析、语义分析、中问代码生成、优化与寄存器分配和汇 编代码生成等部分组成1 1 【”。系统结构参见图2 - 1 。 整个系统的工作流程是由一个总控制程序控带l j ( g c c t o p l e v c ) ,经过前端分析和 后端处理两遍扫描来完成从一个g n u c 源文件到目标机汇编代码的转换。如果从 细的处理流程来划分,在执行所有优化的情况下,g c c 为一个g n uc 函数生成汇 编代码需经过2 0 遍的处理。 在前端分析中,总控程序负责初始化、解释参数、打开关闭文件并控制各遍 的操作。前端分析完成语法、语义分析和中间代码的生成。它的输入为预处理后 的源文件,输出是r t l 中间代码。语法分析是这遍扫描的核心,它仅被调用一次 电子科技大学硕士学位论文 并控制各种语义成分的翻译和中间代码的生成。当分析一函数时,该函数中的语 句将被转换成r t l 。声明和表达式的翻译是由一个中间数据结构语法树过渡 后蒋生成中间代码实现的。语法树不完全遵从c 语法,因为它也被扩展来支持其 它语言。 后端处理负责各种优化、寄存器分配和汇编代码的生成。优化包括全部的常 规优化和主要的r i s c 优化,它们的代码在g c c 中占有相当大的份量,而且每种 优化都是对r t l 中间代码的一遍处理。这些优化是:转移优化、指令调度优化和 延迟分枝优化等。其中,转移优化最多可执行三次:第一次在r t l 中间代码生成 之后,第二次在公共子表达式删除之后,第三次在寄存器重载处理执行之后。公 共子表达式删除被执行二次,第一次在转移优化之后,第:二次在循环优化之后:指 令调度优化被执行二次,第一次在指令归并优化之后,第二次在重载处理之后。 循环优化除了执行循环不变式提取之外,还可选择地执行循环展开优化,如加长 循环体代码,以减少循环次数。指令归并优化、指令调度优化和延迟分枝优化均 是在目标机器描述的引导j i ,通过模式匹配算法完成的。局部和全局寄存器的分 配是依据数据流分析进行的,前者完成基本块内的优化,后者完成剩余的跨越基 本块的优化。后端的最后一遍处理是汇编代码的生成。当经过前面几遍的分析处 理后,提交给代码生成的r t l 代码己经含有汇编指令的雏形。在机器描述产生的 各种数抓结构的引导下,代码生成的主要工作是进行指令识别、获取汇编指令模 板,并据此输出汇编指令模板,并据此输出汇编指令代码,最终完成对一个g n uc 代码程序的翻译。 2 2g c c 的实现步骤 g c c 的实现步骤包括:预编泽p r e p r o c e s s ( g c c - e ) 、编洋c o m p i l e ( g c c ) 、汇编 a s s e m b l e ( a s ) 和连接l i n k ( 1 d ) f 4 j 。 1 预编译p r e p r o c e s s 源代码中的预编译指示以“撑”为前缀。可以通过在g c c 后加上e 选项来调用 预编译器。预编译过程通过完成三个主要任务给了代码很大的灵活性。 1 ) 将“i n c l u d e ”的文件拷贝到编译的源文件中 2 ) 用实际值替代“d e f i n e ”的文本 3 ) 在调用宏的地方进行宏替换 2 编译c o m p i l e 1 0 塑三主鱼! 里塑堡墨堕坌堑 作为一个中间步骤,g c c 把源代码翻译成汇编语言。这是一项极其复杂的工作, 包括词法分析、语法分析、中间代码产生、编译优化和汇编代码生成。 3 汇编a s s e m b l e g c c 通过a s 把汇编语言代码转换为目标代码。事实上,目标代码并不能 在c p u 上运行。编译器选项一c 把e 文件转换为以o 为扩展名的目标文件。 4 连接l i n k 连接器1 d 使用下面的命令,接受前面由a s 创建的目标文件并把它转换为 可执行文件。 2 3g c c 的词法分析和语法分析 2 3 1g c c 的词法分析的主要功能 词法分析程序的输入( 即其扫描的源程序文件) 是预处理程序程序的输出, 预处理的输出是放在一个缓冲区内,词法分析程序将从该缓冲区内读取字符作为 自己的输入。 词法分析是编译的第一阶段,它的主要任务是从左到右逐个字符地对源程序 文件进行扫描,产生一个个单词序列,用以语法分析。执行词法分析的程序称为 词法分析程序或扫描程序。 词法分析程序可由词法产生器l e x 产生或是人工编写,在g c c 中,词法分 析程序是人工编写的,因此g c c 的词法分析程序具有较好的可读性。它主要包含 c 一1 e x - c ,c l e x h 文件以及相关的文件,其主要功能由函数y y l e x 实现。从预处理的 输出文件中一个一个地读取字符,按照尽可能大的原则组成单词( ( t o k e n ) ,组成的 单词是放在单词的输出缓冲中。对数字常量、字符常量等,为其建立节点,并使 v v v a l t t v p e 指向此节点,返回单词的值( v a l u e ) 。其中单词的属性值是通过结构变 量y y v a l t t y p e ,y y v a l c o d e ,y y v a l i t y p e 返回的。 g c c 的词法分析程序将单词分成6 类: 1 标识符:包括关键字和自定义标识符。由字母( a z ,a z ) 、下划线g g 一| , t 和“ ”开头,以及数字组成的单词。组成单词后首先判别该单词是否是 关键词,若是则写相应的属性值。若不是关键词,则该单词是用户自定义 的标识符,为其建立一个节点,并添加到链表中。 1 1 电子科技大学硕士学位论文 4 o 2 3 2 数字。由数字“0 - 9 ”组成的单词。其中又可分为1 6 , 1 0 , 8 进制,且 有浮点和非浮点之分。 字符常量。单引号包含的字符常量。 字符串常量。由双引号包含的字符串常量。当由l 开头的字符串常量 ( “l ”) 为宽字符串( w i d e s t r i n g ) 常量。 运算符。包括算术运算符和逻辑运算符以及指针运算符。 其它。如:“ ”、“ ”等。 词法分析的流程图及其说明 在g c c 中,词法分析程序是一个子程序,每当语法分析程序需要一个单词时, 则调用该子程序词法分析程序每被调用一次,便从源程序文件读入一些字符,直 至识别出一个单词,或说是直至下一个单词的第一个字符为j e 。g c c 的词法分析 程序是通过调用c 的标准库函数g e t c ( f i n p u t ) ,u n g e t c ( c ,f i n p u o 来实现从源程序文件 读取字符到单词的缓冲区及将字符放回到输入源程序文件的。 词法分析程序的流程图f 见图2 - 2 1 及其说明: 词法分析程序的功能主要由函数y y l e x 来实现,y y l e x 调用标准库函数g e t c 从 源程序文件中逐个读取字符,该源程序文件是g c c 预处理的输出文件,并对该字 符进行分析处理。 首先函数y y l e x 判别读入的字符是否为转义字符,若是转义字符,则跳过转义 字符,然后再从源程序文件中读取字符。接着判别该字符是否为,等, 若是则调用函数s k i p _ w h i t e _ s p a c e 取得新字符。将读入的字符暂时放在临时变量中, 并对该字符进行分析处理。 在词法分析程序的流程图中,将可能组成单词字的符分成八种情况分析处理, 以下分别对每种情况作简要的说明。 1 )e o f 是源程序文件的结束符号。当词法分析程序读到该字符时,就认 为对源程序文件的扫描工作结束了,也可以说是词法分析结束了。 2 )l 是宽字符常量或是宽字符串常量的起始标志。如果l 后是或, 则是宽字符常量。 3 )$ 是美元符号。如果标志位被置1 ,则它作为组成标识符的字符元素, 否则返回$ 。 第二章g c c 编译器的分析 4 ) 6 ) 7 ) 8 ) 由字符a z ,a z ,- ,( $ ) 开始的单词是标识符。调用函数 i sr e s e r v e dw o r d 函数在关键字( 或保留字) 表中查找此标识符是否 存在,若找到则该标识符为保留字。否则为用户自定义的标识符,调 用函数g e ti d e n t i f i e r 在h a s ht a b l e 中查找该标识符,如果找到则返回 指向此节点的指针,否则调用函数m a k en o d e 建立一个节点,返回此 节点的指针。 由数字0 9 ,开始的单词构成各种数,包括整数,实数,指数,浮 点数,复数等,有八进制,十进制和十六进制以及由一u ,i ,u ,l , 修饰的数。 由开始的单词是字符常量,即由单引号包含的字符是字符常量。 由开始的单词是字符串常量,即双引号包含的单词是字符串常量。 由“+ ”、“一”、“& ”、“1 ”“ ”、“$ ”、“”、“”、“州、“! ”、“= ” 构成算术运算符和逻辑运算符。 经过分析处理的字符将被放入单词的缓冲区内,函数y y l e x 将此单词的值返 回给调用它的语法分析程序,其属性值将通过结构变量y y l v a l t t y p e 等返回。 电子科技大学硕士学位论文 2 3 3 g c c 语法分析程序的主要功能 语法分析是编译过程的第二个阶段。语法分析的任务是在词法分析的基础上 将单词序列分解成各类语法短语,如“程序”,“语句”,“表达式等等。一般这 种语法短语也称为语法单位,可表示成语法树。 2 3 3 1 语法分析程序的主要功能 语法分析所依据的是语言的语法规则,即描述程序结构的规则。通过语法分 析确定整个输入串是否构成一个语法上i e 确的程序。在g c c 中采用自底向上 ( b o t t o m - u p ) 最右规约的语法分析方法进行分析的,因为g c c 的语法分析程序是 由语法分析程序自动产生器( y a c c ) 生成,u l 方法是y a c c 设定的语法分析方 法。 语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。例如 语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运 算对象,当不符台语言规范时,编译程序应报告错误。 词法分析和语法分析本质上都是对源程序的结构进行分析。但词法分析的任 务仅对源程序进行线性扫描即可完成,例如识别标识符,因为标识符的结构是字 母打头的字母和数字串,这只要顺序扫描输入流,遇到既不是字母又不是数字字 符时,将前面所发现的所有字母可数字组合在一起而构成单词标识符。 2 3 3 2 语法分析程序自动产生器( y a c c ) 由于g c c 中的语法分析程序是由y a c c 产生的,故在此对y a c c 的工作原理 作一简要的介绍。y a c c 的工作示意图如图3 - 3 所示: y a c c 源程序 在图中y a c c 源程序是用户用y a c c 提供的一种类似b n f 的语言写的要处理 的语言的语法描述。y a c c 会自动的将这个源程序转换成用l r 方法进行语法分析 的语法分析程序y y p a r s e ,y a c c 的宿主语言是c 。因此y y p a r s e 是一个c 语言的程 第二章g c c 编译器的分析 序,用户在主程序中通过调用y y p a r s e 进行语法分析。 语法分析必须建立在词法分析的基础之上,所以生成的语法分析程序还要有 个词法分析程序与它配合工作。y y p a r s e 要求这个词法分析程序的名字为y y l e x 。 用户写y y l e x 时可以借助于l e x ,电可以人工编写。 在y a c c 源程序中除了语法规则外,还要包括当这些语法规则被识别出来时, 即用它们进行归约时要完成的语义动作,语义动作是用c 语言写的程序段。 语法分析的输出可能是颗语法树,或生成的目标代码,或者就是关于输入 串是否符合语法的信息。需要什么样的输出都是由语义动作和程序部分的程序段 来实现的。 2 3 3 3 语法分析程序的文件构成 语法分析程序尽管是由y a c c 自动产生的,但其语义动作是由用户自己编写 的c 代码,构成语法分析程序的文件有:c p a r s e y ,t r e e h ,t r e e d e f ,c t r e e h ,t r e e c , c - d e c i c ,c - t y p e c k c ,s t m t c 等。其中c p a r s e y 是根据y a c c 的规范要求对c 语言 文法进行的语法描述文件,即y a c c 源程序,经y a c c 可产生相应的c 文件 c p a r s e c 。 相关的文件有c l e x h ,i n p u t h ,c i t e r a t e c ,v a r a s m c ,c - c o m m o n c ,c - l e x c m a c h m o d e h ,m a c h m o d e d e f ,o b s t a c k h ,r e a l h ,r t l h 等。 2 3 4g c c 语法分析和语义分析的流程图及其说明 2 3 4 1 语法分析程序的主要工作原理 归约( r e d u c ea c t i o n ) 是用语法规则的左边代替其右边的过程。当语法分析程 序己经看到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论