暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
深入分析GCC.pdf
289
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
of 92
10墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜