暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
深入分析GCC.pdf
202
92页
1次
2023-12-19
10墨值下载
GCC(GNU Compiler Collection,GNU编译器套件)是一套由GNU开发的程序设计语言编译工具,是GNU工程中最重要的组成部分。经过近30年的发展,GCC不仅支持众多的前端编程语言,还支持各
种主流的处理器平台和操作系统平台,成为公认的跨平台编译器的事实标准,也成为编译器设计的成功典范。
作为一名GCC编译器的使用者和源码阅读的爱好者,我一直想写一本关于GCC的技术书。
2002年,我开始在Linux系统上进行一些软件开发,GCC就是我使用的编译工具。我一直对从源代码到目标代码的转换过程充满好奇,想知道在这个过程中GCC到底都做了些什么?GCC是如何设计的,
那些成千上万个GCC的源代码文件都表示了什么意义?那时我常常幻想,要是能透彻地分析和理解GCC源代码,多好!从那时起,在教学科研之余,我偶尔会翻阅一下GCC的相关源代码,可是看着繁多
GCC源代码,也常常感觉手足无措,真有一种“老虎吃天,无法下爪”的尴尬。于是分析GCC源代码的事情被搁置了,然而那种一探究竟的心情总是挥之不去。
2012年开始,我有了较多的闲暇时间,在经过一段彷徨之后,分析GCC源代码的冲动又一次浮现在脑海。我知道,这次是要来真的了,我要做点自己喜欢的事。
Why?
我有空余时间了,我要干些自己感兴趣的事情。在我创建的GCC爱好者交流群中经常有朋友问,有没有介绍GCC的资料呀?大多人都会说,有——请看官方文档!我也去看了看,没错,GCC有比较详
细的官方文档,包括gccinternal及用户手册等。然而,这些文档的内容庞杂,缺乏系统分析GCC设计框架和工作流程的内容,并且大多的内容对读者来讲都是零散的,让初学者无所适从。于是我想,为什么
不分析一下GCC系统,把GCC的设计实现用一种更清晰明了、更系统的方法介绍给GCC的爱好者呢?
What?
本书将围绕GCC编译过程,详细介绍从源代码到AST、从AST到GIMPLE、从GIMPLE到RTL,以及从RTL到最终的目标机器汇编代码的详细过程,涉及各个阶段中间表示的详细分析、生成过程。本书
提供了大量的图表和实例,展示了GCC编译系统的总体工作流程和工作细节。本书的另外一个特点是结合GCC 4.4.0的源代码进行分析,使读者在了解编译原理的基础上进一步掌握其实现的总体流程和细
节,让更多读者对编译技术的认识不再只停留在理论层面,而是向其展示一个编译系统实例的实现过程。
How?
GCC源代码涉及的内容非常庞杂,很难在一本书中全面描述,因此本书以GCC中间表示为主线,详细分析GCC从源代码开始,直到生成目标机器汇编代码的整个过程中所使用的三种中间表示(AST、
GIMPLE及RTL),并对这三种中间表示的基本概念、生成过程进行详细的描述,对基于GIMPLE和RTL的优化处理进行介绍,从而描述一条从源代码到目标机器汇编代码的清晰路线图。
Who
本书以热爱编译系统理论及其实现的在校大学生、研究生为主要读者对象,也可以作为企业中研发编译系统以及进行编译系统移植的研发工程师的有益参考。
在编写这本书的时候,有一种精神支撑着我,我相信“兴趣”加上“坚持”就是胜利!分析GCC不是一年半载的事情,需要3年、5年,甚至更长时间,不过我可以坚持,我要用我的坚持换来对GCC的
深入分析,让更多的GCC爱好者熟悉它、接触它、了解它,更多地参与GCC的开发与维护。
感谢我的爱人和孩子,给了我家的温暖和亲情。感谢病榻上的父亲,虽然他不能和我说话,但他那一双大手,依然经常抚摸在我的头上。感谢年老体弱的母亲,感谢她一直照顾我的父亲,让我知道什
么是坚持,什么是不离不弃!感谢西安邮电大学GPU项目组的各位同事在本书的写作中提出的宝贵建议。
本书的写作得到国家自然科学基金重点项目(项目编号:61136002)以及陕西省教育厅科研计划项目(项目编号:14JK1674)资助。
鉴于作者水平有限,在分析和写作本书的过程中也引入了一些个人观点,因此难免有一些理解的偏差和错误,敬请读者批评指正并不吝赐教,如有意见和建议,请联系作者lazy_linux@126.com,在此一
并感谢!
王亚刚
2016年10月于西安邮电大
1章 GCC
本章主要对GCC的发展过程及GCC的特点进行简介,并给出了本书的主要内容简介。
1.1 GCC产生与发展
GCC(GNU 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。1987年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年7月,GCC与EGCS(Experimental/Enhanced GNU Compiler System)重新融合并发布了GCC 2.95版本。
相关的资料可以查阅以下官方网站信息
GNU Compiler Collectionhttps://gcc.gnu.org/
Free Software Foundationhttp://www.fsf.org/
GNU Projecthttps://gnu.org/
GNU Public Licensehttps://www.gnu.org/licenses/licenses.en.html#GPL
1.2 GCC的特
GCC作为目前较为成功的编译系统之一,具有非常突出的优点,主要包括:
(1)GCC编译系统支持众多的前端编程语言,GCC 4.4.0中${GCC_SOURCE}/gcc/目录下包含了前端编程语言处理的目录及其代码(其中,${GCC_SOURCE}表示GCC源代码的主目录,下同),主要
包括C、C++、Ada、Fortran、Java、Objective-C、Objective-C++等语言的前端处理,可以使用如下命令查看这些目录
[GCC@localhost gcc-4.4.0]$ ls -l gcc
drwxrwxr-x. 3 GCC GCC 69632 Apr 21 2009 ada
drwxrwxr-x. 2 GCC GCC 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对目标处理器的支持情况,其中包括了各种主流的处理器,例
如,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 C库glibc、GNU的调试工具gdb,以及GNU二进制工具链binutils(GNU Binutils
Toolchains,例如汇编工具as,连接工具ld,目标文件分析工具objdump、objcopy等)等都与GCC关系密切,互相依赖。
可以使用下述的shell命令查看GNU二进制工具链中主要包括的工具
[GCC@localhost 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-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 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 2014 /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项目中应用最广泛的工具软件之一,是工程师设计编译系统最典型、最成功的范例,是高校学生学习编译系统最生动、最权威的设计实例,同时也是程序员进行高质量代码设计的有
益参考。本书以GCC 4.4.0的源代码为例,对GCC的设计和实现进行分析和解读,主要涉及以下内容:
(1)GCC的发展历史及特点;
(2)GCC的总体结构;
(3)GCC中各种中间表示(包括抽象语法树、GIMPLE、寄存器传输语言)的生成技术;
(4)GCC中基于GIMPLE的优化处理,这一部分主要实现一些与目标机器无关的性能优化;
(5)GCC中基于RTL的优化处理,这一部分主要实现一些与目标机器相关的性能优化
(6)GCC的移植技术,即如何让GCC支持新的目标机器。
本书将紧密围绕编译系统中的中间表示(IR,Intermediate Representation)这一核心概念,重点介绍GCC中的三种中间表示:抽象语法树(AST,Abstract Syntax Tree)、GIMPLE和寄存器传输
语言(RTL,Register Transfer Language),对其基本概念、存储结构及其生成过程等进行深入分析。由于GCC基于GIMPLE和RTL的优化处理数量非常多,每种优化处理都涉及一个比较独立的优化问
题,很难在本书中一一详述,因此,本书只简单地介绍了GCC中基于GIMPLE及RTL的优化处理的基本组织方式,并对其中一些非常典型的优化处理进行了简介。最后,本书也给出了将GCC成功移植到西
安邮电大学自主研发的阵列处理器上的一个实例。
限于篇幅,书中的大部分代码只给出了简化版本,读者在分析时需要结合源代码仔细研读
2章 GCC
代码分析是一件烦琐的事情。在分析GCC源代码时,几乎所有的人都会说:“这么多的代码,怎么看?”是的,面对GCC 4.4.0如此庞大的代码量,原始的、徒手的做法显然是不足以应付的。在阅读
GCC代码时,通常遇到的典型问题包括:
(1)如何跟踪函数调用;
(2)如何查看一个变量的定义;
(3)如何查看一个函数被哪些函数调用过
(4)如何分析函数之间的调用关系;
(5)如何理解某个函数的工作过程。
当然,除了理解这些表面的问题,更深层的问题就是GCC到底是如何设计的?GCC这么庞大的代码是如何组织的?GCC在进行源代码编译的过程中都包括哪些主要的处理阶段,每个阶段完成了哪些工
作,这些阶段之间又是如何相互联系起来的?
这些问题的回答,都需要对GCC的代码进行详细分析。笔者认为,没有好的工具作为辅助,分析GCC代码几乎是不可能的!本章主要介绍一些作者在分析GCC 4.4.0代码时所使用的一些常用工具,
大家参考。这部分内容仅仅是点到为止,详细内容请参阅其用户文档
本书介绍的所有代码分析工具均基于Centos Linux系统。
2.1 vim+ctags代码阅读工
vim是Linux中应用最广泛的编辑器,也是阅读GCC 4.4.0源代码的首选工具。ctags是一种标签工具,可以配合vim编辑器,帮助用户很方便地实现代码中的符号跟踪。
下面简单介绍使用vim+ctags对GCC 4.4.0源代码分析的过程。为了描述方便,全书使用${GCC_SOURCE}来表示GCC 4.4.0代码所在的顶层目录。
(1)使用yum工具安装ctags程序。
[root@localhost ~]# sudo yum install ctags
(2)使用wget工具从GCC源代码的镜像站点下载GCC 4.4.0的源代码文件
of 92
10墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。