Copyright (C) mohu3g, getok.org. 转载请注明出处。

源代码目录树结构

目录 含义
gcc Front/middle/back ends
libgcc The GCC runtime library
libcpp Pre-processor
config Autoconf macros and Makefile fragments used throughout the tree
contrib Contributed scripts that may be found useful in conjunction with GCC
fixincludes The support for fixing system headers to work with GCC
gnattools Support tools for GNAT
include Headers for the libiberty library
intl GNU libintl, from GNU gettext, for systems which do not include it in libc
libada Ada runtime
libstdc++-v3 C++ runtime
libgfortran Fortran runtime
libobjc Objective-C runtime
libgo Go runtime
boehm-gc Java runtime
libffi Java runtime
libjava Java runtime
zlib Java runtime
libiberty Utility functions and generic data structures
libgomp OpenMP runtime
libssp Stack Smash Protection runtime
libdecnumber Decimal arithmetic library
libatomic Runtime support library for atomic operations (e.g. for __sync and __atomic)
libitm Runtime support library for transactional memory
libquadmath Runtime support library for quad-precision math operations

其他的目录,GCC Internals 也未说明。

构建系统

术语:build, host, target

build: 指的是你编译GCC源代码所在机器

host: 指的是编译后的GCC可执行文件所运行在的机器

target: 指的是编译后的GCC所产生的代码所运行的机器

根据排列组合,总共就有五种情况:

  • 如果 build = host = target,我们就说这是一个 native
  • 如果 build = host != target,我们说这是一个 cross (交叉编译)。
  • 如果 build != host != target,我们说这是一个 canadian
  • 如果 build != host = target,相当于你用一个 cross-compiler 去编译另一个系统的 native。此情况叫做 host-x-hostcrossed nativecross-built native
  • 如果 build = target != host,相当于你用一个 cross-compiler 去编译一个产生你 build 所在系统代码的 cross-compiler,此情况一般叫做 crossback

GCC 使用的是 autotools,或者叫做 GNU Build System。主要的构建工具有 autoconf, automake, libtool, autoscan, m4, aclocal, autoheader, autogen 等。这些工具大部分都是 perl 编写的脚本。

源代码根目录下的 Makefile.in

源代码根目录下的 Makefile.in 并非由 Makefile.am + automake 生成。因为首先并没有 Makefile.am 这个文件,其次发现几乎所有子目录都没有 Makefile.am 文件,而只有现成的 Makefile.in

Makefile.in 文件头部注释写着,此文件是由 autogen Makefile.def 自动生成。了解下 autogen 之后,知道其实根目录下的 Makefile.in 是由 Makefile.tpl (模板文件)、Makefile.def (定义文件),然后借由 autogen 自动生成。

autogen 是一个用来处理程序文件中有大量重复的文本的需要替换的工具。一般需要一个定义文件(.def)和一个模板文件(.tpl)。

有关 autogen 的手册文档,可参见:The Automated Program Generator

main 函数入口

  1. gcc/gcc-main.c: main 函数。此文件是GCC驱动程序入口。也就是当我们在命令输入 gcc hello.c 时的入口。
  2. gcc/gcc.c: driver::main,被第一步的main函数调用。
  3. gcc/main.c: main 函数,GCC驱动程序的子程序,是实际的编译程序,由第二步调用。
  4. gcc/toplev.c: toplev::main,由第三步调用。开始处理命令行参数,并执行编译。

小结

本文简单概述了下 GCC 的源代码目录结构、构建系统涉及的概念和工具,以及main函数的入口。在阅读 GCC 之前,有必要先了解下它的构建过程。因此,需要如下前置学习:

  • GNU Build Systemautoconf, automake, libtool, m4, autogen, autoheader, autoscan 等工具
  • Shell Script:这些自动化脚本大量使用了 shell script
  • Perlautotools 中有些工具使用 perl 编写。
  • Makefile:这一切的基础。

参考文档

  1. GCC Internals
  2. GCC Source Code Repository
  3. autogen: The Automated Program Generator
  4. GNU Autoconf
  5. GNU Automake
  6. GNU libtool
  7. GNU m4