深入分析GCC
上QQ阅读APP看书,第一时间看更新

3.1 GCC的目录结构

GCC的源代码可以从GCC的官网(https://gcc.gnu.org)上获得。该源代码包主要包括bz2和gz两种压缩形式的tar包,以gcc-4.4.0为例,分别为gcc-4.4.0.tar.bz2及gcc-4.4.0.tar.gz。

可以通过如下的命令获取gcc-4.4.0.tar.bz2代码,进行源代码包的解压,并查看其主要的目录结构。

             [GCC@host2 gcc-4.4.0]$ wget -c http://www.netgull.com/gcc/releases/gcc-4.4.0/gcc-
         4.4.0.tar.bz2
             [GCC@host2 gcc-4.4.0]$ tar -xjvf gcc-4.4.0.tar.bz2
             [GCC@host2 gcc-4.4.0]$ cd gcc-4.4.0; ls
             ABOUT-NLS               COPYING.LIB          libgfortran         MAINTAINERS
             boehm-gc                COPYING.RUNTIME      libgomp             maintainer-scripts
             ChangeLog               depcomp              libiberty           Makefile.def
             ChangeLog.tree-ssa      fixincludes          libjava             Makefile.in
             compile                 gcc                  libmudflap          Makefile.tpl
             config                  gnattools            libobjc             MD5SUMS
             config.guess            include              libssp              missing
             config-ml.in            INSTALL              libstdc++-v3        mkdep
             config.rpath            install-sh           libtool-ldflags     mkinstalldirs
             config.sub              intl                 libtool.m4          move-if-change
             configure               LAST_UPDATED         ltgcc.m4            NEWS
             configure.ac            libada               ltmain.sh           README
             contrib                 libcpp               lt~obsolete.m4     symlink-tree
             COPYING                 libdecnumber         ltoptions.m4        tags
             COPYING3                libffi               ltsugar.m4          ylwrap
             COPYING3.LIB            libgcc               ltversion.m4        zlib

该源代码目录中的主要内容包括:

(1)与GCC编译配置有关的config*文件。

(2)lib*目录:各种各样的库文件,既包括一些通用的库文件,也包含一些与语言相关的库文件,例如libcpp中包含与C++语言相关的代码库文件,libada中包含与ADA语言相关的代码库文件。

(3)gcc目录中包含GCC的核心代码,包括了与各种编程语言相关的词法、语法等前端分析程序,与各种目标机器相关的机器描述文件,以及与前端语言无关且与机器无关的核心处理代码等。

使用如下shell命令可以列出gcc目录中的所有子目录,其中包含如下的一些子目录:

             [GCC@host2 gcc-4.4.0]$ ls -l gcc | grep ^d
             drwxrwxr-x.   3 GCC GCC    69632 Apr 21   2009 ada
             drwxrwxr-x. 37 GCC GCC      4096 Apr 21   2009 config
             drwxrwxr-x.   2 GCC GCC     4096 Apr 21   2009 cp
             drwxrwxr-x.   3 GCC GCC     4096 Apr 21   2009 doc
             drwxrwxr-x.   2 GCC GCC     4096 Apr 21   2009 fortran
             drwxrwxr-x.   2 GCC GCC     4096 Apr 21   2009 ginclude
             drwxrwxr-x.   2 GCC GCC     4096 Apr 21   2009 java
             drwxrwxr-x.   2 GCC GCC     4096 Apr 21   2009 objc
             drwxrwxr-x.   2 GCC GCC     4096 Apr 21   2009 objcp
             drwxrwxr-x.   2 GCC GCC     4096 Apr 21   2009 po
             drwxrwxr-x. 18 GCC GCC      4096 Apr 21   2009 testsuite

gcc目录下的gcc/cp、gcc/fortran、gcc/java、gcc/objc、gcc/objcp等子目录就是与各种编程语言相关的处理部分,这几个目录分别处理编程语言C++、Fortran、Java、Object C、Object C++等,C语言的处理则是GCC默认的处理前端语言,其部分处理代码在gcc/目录中。

进一步查看gcc/config目录中所包含的子目录:

             [GCC@host2 gcc-4.4.0]$ ls -l gcc/config | grep ^d
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 alpha
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 arc
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 arm
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 avr
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 bfin
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 cris
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 crx
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 fr30
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 frv
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 h8300
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 i386
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 ia64
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 iq2000
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 m32c
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 m32r
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 m68hc11
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 m68k
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 mcore
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 mips
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 mmix
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 mn10300
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 pa
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 pdp11
             drwxrwxr-x. 3 GCC GCC   4096 Apr 21   2009 picochip
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 rs6000
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 s390
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 score
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 sh
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 soft-fp
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 sparc
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 spu
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 stormy16
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 v850
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 vax
             drwxrwxr-x. 2 GCC GCC   4096 Apr 21   2009 xtensa

从目录的名称上就可以看出来,这些目录分别对应了各种不同的目标机器名称。目录中包含的内容就是针对不同目标机器的机器描述文件,包括md文件及相应的c文件和h文件等。例如i386目录中包含了Intel x86处理器的机器描述文件等,arm目录中则包含了ARM处理器的机器描述文件等。

完整的目录结构说明请查阅GCC相关说明文档。也可以参考Uday Khedker的《GCC Source Code: An Internal View》(http://www.cse.iitb.ac.in/grc/)。