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/)。