本节书摘来自华章出版社《深入分析GCC 》一书中的第3章,第3.1节,作者 王亚刚 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
第3章
GCC总体结构
GCC是一个复杂的软件系统,例如gcc-4.4.0.tar.gz软件包中包含了成千上万个文件。本章主要对GCC的代码结构和目录结构进行介绍,阐明GCC的主要模块及其相互关系,并给出GCC源代码编译的主要步骤和关键问题。
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编译配置有关的conf?ig*文件。
(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/conf?ig目录中所包含的子目录:
[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/)。