对于gcc的一些概念,一直都比较模糊。在使用上我们都知道编译c时使用gcc命令,编译c++时使用g++命令;gcc也可以用来编译c++,gcc与g++在使用上的主要区别是g++会自动连接stdc++库。这些使用上的概念使得gcc的前端显得有些混乱。在网上查找有关gcc于g++的关系,有的说gcc会在内部调用g++,有的说g++调用gcc,但都没有更明确的解释他们之间的关系。
要想在结构上了解gcc前端,就只有查看gcc源码,自己找答案了。
Compiler Driver
在gcc中,我们使用的gcc和g++命令,以及其他语言的命令(gccgo),都被称作compiler driver。他们本身并不做具体的编译工作,而是用来解析命令行参数,调用具体的编译器和其他工具来驱动整体的编译过程。无论使用gcc或者g++,我们都可以通过-v参数显示整体构建过程。在这个过程中我们会看到对于真正的编译器cc1(c compiler)或者cc1plus(c++ compiler)的调用,以及对于as(汇编器)和collect2(连接器)的调用。
Compiler Driver的代码基本结构如下:
我们可以看到,gcc和g++可执行程序都使用gcc.c中的main函数作为入口函数。他们真正的区别在于gcc包含了gccspec.c文件,而g++包含了g++spec.c文件。在这两个文件中,分别实现了lang_specific_driver函数。这个函数被这个compiler driver框架用来在命令行参数处理前添加特殊的标志。对于stdc++的默认连接就是在g++spec.c中处理的。
所以,gcc与g++都是基于同一套compiler driver框架,大部分功能都是一样的,只有很小的不同。
Compiler Proper
正如上面提到的,gcc和g++只是compiler driver,而真正的c和c++编译器是另外两个可执行程序,cc1和cc1plus,他们负责真正的编译工作。
Compiler Proper的基本结构如下:
同样,cc1和cc1plus都使用main.c中的main函数作为入口函数,共享同一个编译器框架。cc1与cc1plus分别通过c-lang.c和cp-lang.c提供一个lang_hooks结构体,作为编译器框架对于语言的回调处理。
以上博文转自http://blog.csdn.net/yuanlin2008/article/details/8283382