深入分析GCC.html.pdf
《深入分析GCC.html.pdf》由会员分享,可在线阅读,更多相关《深入分析GCC.html.pdf(92页珍藏版)》请在三一文库上搜索。
1、前言 GCC(GNU Compiler Collection,GNU编译器套件)是一套由GNU开发的程序设计语言编译工具,是GNU工程中最重要的组成部分。经过近30年的发展,GCC不仅支持众多的前端编程语言,还支持各 种主流的处理器平台和操作系统平台,成为公认的跨平台编译器的事实标准,也成为编译器设计的成功典范。 作为一名GCC编译器的使用者和源码阅读的爱好者,我一直想写一本关于GCC的技术书。 2002年,我开始在Linux系统上进行一些软件开发,GCC就是我使用的编译工具。我一直对从源代码到目标代码的转换过程充满好奇,想知道在这个过程中GCC到底都做了些什么?GCC是如何设计的, 那些成千
2、上万个GCC的源代码文件都表示了什么意义?那时我常常幻想,要是能透彻地分析和理解GCC源代码,多好!从那时起,在教学科研之余,我偶尔会翻阅一下GCC的相关源代码,可是看着繁多的 GCC源代码,也常常感觉手足无措,真有一种“老虎吃天,无法下爪”的尴尬。于是分析GCC源代码的事情被搁置了,然而那种一探究竟的心情总是挥之不去。 2012年开始,我有了较多的闲暇时间,在经过一段彷徨之后,分析GCC源代码的冲动又一次浮现在脑海。我知道,这次是要来真的了,我要做点自己喜欢的事。 Why? 我有空余时间了,我要干些自己感兴趣的事情。在我创建的GCC爱好者交流群中经常有朋友问,有没有介绍GCC的资料呀?大多人
3、都会说,有请看官方文档!我也去看了看,没错,GCC有比较详 细的官方文档,包括gccinternal及用户手册等。然而,这些文档的内容庞杂,缺乏系统分析GCC设计框架和工作流程的内容,并且大多的内容对读者来讲都是零散的,让初学者无所适从。于是我想,为什么 不分析一下GCC系统,把GCC的设计实现用一种更清晰明了、更系统的方法介绍给GCC的爱好者呢? What? 本书将围绕GCC编译过程,详细介绍从源代码到AST、从AST到GIMPLE、从GIMPLE到RTL,以及从RTL到最终的目标机器汇编代码的详细过程,涉及各个阶段中间表示的详细分析、生成过程。本书 提供了大量的图表和实例,展示了GCC编译
4、系统的总体工作流程和工作细节。本书的另外一个特点是结合GCC 4.4.0的源代码进行分析,使读者在了解编译原理的基础上进一步掌握其实现的总体流程和细 节,让更多读者对编译技术的认识不再只停留在理论层面,而是向其展示一个编译系统实例的实现过程。 How? GCC源代码涉及的内容非常庞杂,很难在一本书中全面描述,因此本书以GCC中间表示为主线,详细分析GCC从源代码开始,直到生成目标机器汇编代码的整个过程中所使用的三种中间表示(AST、 GIMPLE及RTL),并对这三种中间表示的基本概念、生成过程进行详细的描述,对基于GIMPLE和RTL的优化处理进行介绍,从而描述一条从源代码到目标机器汇编代码
5、的清晰路线图。 Who? 本书以热爱编译系统理论及其实现的在校大学生、研究生为主要读者对象,也可以作为企业中研发编译系统以及进行编译系统移植的研发工程师的有益参考。 在编写这本书的时候,有一种精神支撑着我,我相信“兴趣”加上“坚持”就是胜利!分析GCC不是一年半载的事情,需要3年、5年,甚至更长时间,不过我可以坚持,我要用我的坚持换来对GCC的 深入分析,让更多的GCC爱好者熟悉它、接触它、了解它,更多地参与GCC的开发与维护。 感谢我的爱人和孩子,给了我家的温暖和亲情。感谢病榻上的父亲,虽然他不能和我说话,但他那一双大手,依然经常抚摸在我的头上。感谢年老体弱的母亲,感谢她一直照顾我的父亲,让
6、我知道什 么是坚持,什么是不离不弃!感谢西安邮电大学GPU项目组的各位同事在本书的写作中提出的宝贵建议。 本书的写作得到国家自然科学基金重点项目(项目编号:61136002)以及陕西省教育厅科研计划项目(项目编号:14JK1674)资助。 鉴于作者水平有限,在分析和写作本书的过程中也引入了一些个人观点,因此难免有一些理解的偏差和错误,敬请读者批评指正并不吝赐教,如有意见和建议,请联系作者lazy_,在此一 并感谢! 王亚刚 2016年10月于西安邮电大学 第1章 GCC概述 本章主要对GCC的发展过程及GCC的特点进行简介,并给出了本书的主要内容简介。 1.1 GCC的产生与发展 GCC(GN
7、U Compiler Collection)是GNU工程(GNU Project)中的核心工具软件,其官方网址为https:/gcc.gnu.org/。GCC支持多种前端的编程语言,包括C、C+、Java、Ada和Fortran等, 其编译生成的目标代码可以在几乎所有的处理器平台上运行,是目前使用最广泛的编译系统之一。GCC遵循GNU GPL(GNU Public License)协议,由FSF(Free Software Foundation)发布。GNU和 GCC的图标如图1-1所示。 图1-1 GNU及GCC的图标 初期的GCC仅仅作为C语言的编译器,即GNU C Compiler。19
8、87年GCC 1.0发布,同年12月,GCC开始支持C+语言,随后,GCC开始支持Objective-C、Objective-C+、Fortran、Java和Ada等 语言。与此同时,GCC也被逐渐移植到各种各样的主流处理器体系结构上,包括i386、ix86_64、SPARCE、ARM和MIPS等处理器平台。 自从1987年Richard Stallman和Len Tower发布GCC的第一个版本GCC 1.0以来,目前GCC的最新版本已经更新到GCC 6.0,https:/gcc.gnu.org/releases.html给出了GCC在各个时期推出的GCC版 本,其中最重大的变化是在1999
9、年7月,GCC与EGCS(Experimental/Enhanced GNU Compiler System)重新融合并发布了GCC 2.95版本。 相关的资料可以查阅以下官方网站信息: GNU Compiler Collection:https:/gcc.gnu.org/ Free Software Foundation:http:/www.fsf.org/ GNU Project:https:/gnu.org/ GNU Public License:https:/www.gnu.org/licenses/licenses.en.html#GPL 1.2 GCC的特点 GCC作为目前较为成功
10、的编译系统之一,具有非常突出的优点,主要包括: (1)GCC编译系统支持众多的前端编程语言,GCC 4.4.0中$GCC_SOURCE/gcc/目录下包含了前端编程语言处理的目录及其代码(其中,$GCC_SOURCE表示GCC源代码的主目录,下同),主要 包括C、C+、Ada、Fortran、Java、Objective-C、Objective-C+等语言的前端处理,可以使用如下命令查看这些目录: GCClocalhost gcc-4.4.0$ ls -l gcc drwxrwxr-x. 3 GCC GCC 69632 Apr 21 2009 ada drwxrwxr-x. 2 GCC GCC
11、 4096 Nov 27 2013 cp drwxrwxr-x. 2 GCC GCC 4096 Nov 6 15:14 fortran drwxrwxr-x. 2 GCC GCC 4096 Oct 9 17:34 java drwxrwxr-x. 2 GCC GCC 4096 Apr 21 2009 objc drwxrwxr-x. 2 GCC GCC 4096 Apr 21 2009 objcp (2)GCC支持众多的目标机器体系结构,具有良好的可移植性,GCC 4.4.0的$GCC_SOURCE/gcc/config/目录下包含了GCC对目标处理器的支持情况,其中包括了各种主流的处理器,例
12、 如,arm、i386、mips以及alpha等,以下是GCC 4.4.0代码所支持的处理器列表: alpha arc arm avr cris crx fr30 frv h8300 i386 ia64 iq2000 m32c m32r m68hc11 m68k mcore mips mmix mn10300 pa pdp11 picochip rs6000 s390 score sh sparc spu stormy16 v850 vax xtensa (3)GCC具有丰富的配套工具链支持。 GCC不是一个孤立的编译工具,而是整个GNU工程中的一个组成部分。GNU工程中的其他软件,包括GNU
13、 C库glibc、GNU的调试工具gdb,以及GNU二进制工具链binutils(GNU Binutils Toolchains,例如汇编工具as,连接工具ld,目标文件分析工具objdump、objcopy等)等都与GCC关系密切,互相依赖。 可以使用下述的shell命令查看GNU二进制工具链中主要包括的工具: GCClocalhost paag-gcc$ rpm -ql binutils | xargs ls -l | grep “/usr/bin“ -rwxr-xr-x. 1 root root 24352 Oct 15 2014 /usr/bin/addr2line -rwxr-xr-
14、x. 1 root root 54444 Oct 15 2014 /usr/bin/ar -rwxr-xr-x. 1 root root 527220 Oct 15 2014 /usr/bin/as -rwxr-xr-x. 1 root root 26356 Oct 15 2014 /usr/bin/c+filt -rwxr-xr-x. 1 root root 99212 Oct 15 2014 /usr/bin/gprof -rwxr-xr-x. 1 root root 588116 Oct 15 2014 /usr/bin/ld -rwxr-xr-x. 1 root root 38800
15、Oct 15 2014 /usr/bin/nm -rwxr-xr-x. 1 root root 212216 Oct 15 2014 /usr/bin/objcopy -rwxr-xr-x. 1 root root 276528 Oct 15 2014 /usr/bin/objdump -rwxr-xr-x. 1 root root 54448 Oct 15 2014 /usr/bin/ranlib -rwxr-xr-x. 1 root root 288560 Oct 15 2014 /usr/bin/readelf -rwxr-xr-x. 1 root root 27196 Oct 15 2
16、014 /usr/bin/size -rwxr-xr-x. 1 root root 25832 Oct 15 2014 /usr/bin/strings -rwxr-xr-x. 1 root root 212244 Oct 15 2014 /usr/bin/strip (4)GCC提供可靠、高效、高质量的目标代码。 GCC是目前使用的最为广泛的编译器系统之一,众多工业级应用的实践证明,GCC编译系统生成的代码具有很高的可靠性和运行效率。 (5)GCC对于并行编译的支持。 在GCC 4.4.0中,已经提供了对OpenMP的完整支持。 1.3 GCC代码分析 GCC作为目前GNU项目中应用最广泛的
17、工具软件之一,是工程师设计编译系统最典型、最成功的范例,是高校学生学习编译系统最生动、最权威的设计实例,同时也是程序员进行高质量代码设计的有 益参考。本书以GCC 4.4.0的源代码为例,对GCC的设计和实现进行分析和解读,主要涉及以下内容: (1)GCC的发展历史及特点; (2)GCC的总体结构; (3)GCC中各种中间表示(包括抽象语法树、GIMPLE、寄存器传输语言)的生成技术; (4)GCC中基于GIMPLE的优化处理,这一部分主要实现一些与目标机器无关的性能优化; (5)GCC中基于RTL的优化处理,这一部分主要实现一些与目标机器相关的性能优化; (6)GCC的移植技术,即如何让GC
18、C支持新的目标机器。 本书将紧密围绕编译系统中的中间表示(IR,Intermediate Representation)这一核心概念,重点介绍GCC中的三种中间表示:抽象语法树(AST,Abstract Syntax Tree)、GIMPLE和寄存器传输 语言(RTL,Register Transfer Language),对其基本概念、存储结构及其生成过程等进行深入分析。由于GCC基于GIMPLE和RTL的优化处理数量非常多,每种优化处理都涉及一个比较独立的优化问 题,很难在本书中一一详述,因此,本书只简单地介绍了GCC中基于GIMPLE及RTL的优化处理的基本组织方式,并对其中一些非常典型
19、的优化处理进行了简介。最后,本书也给出了将GCC成功移植到西 安邮电大学自主研发的阵列处理器上的一个实例。 限于篇幅,书中的大部分代码只给出了简化版本,读者在分析时需要结合源代码仔细研读。 第2章 GCC源代码分析工具 代码分析是一件烦琐的事情。在分析GCC源代码时,几乎所有的人都会说:“这么多的代码,怎么看?”是的,面对GCC 4.4.0如此庞大的代码量,原始的、徒手的做法显然是不足以应付的。在阅读 GCC代码时,通常遇到的典型问题包括: (1)如何跟踪函数调用; (2)如何查看一个变量的定义; (3)如何查看一个函数被哪些函数调用过; (4)如何分析函数之间的调用关系; (5)如何理解某个
20、函数的工作过程。 当然,除了理解这些表面的问题,更深层的问题就是GCC到底是如何设计的?GCC这么庞大的代码是如何组织的?GCC在进行源代码编译的过程中都包括哪些主要的处理阶段,每个阶段完成了哪些工 作,这些阶段之间又是如何相互联系起来的? 这些问题的回答,都需要对GCC的代码进行详细分析。笔者认为,没有好的工具作为辅助,分析GCC代码几乎是不可能的!本章主要介绍一些作者在分析GCC 4.4.0代码时所使用的一些常用工具,供 大家参考。这部分内容仅仅是点到为止,详细内容请参阅其用户文档。 本书介绍的所有代码分析工具均基于Centos Linux系统。 2.1 vim+ctags代码阅读工具 v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入 分析 GCC html
链接地址:https://www.31doc.com/p-5518767.html