您的位置:首页 > Web前端

gcc前端的基本结构

2012-12-17 11:47 796 查看
原文

对于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,负责真正的编译工作。
Compiler Proper的基本结构如下:



同样,cc1和cc1plus都使用main.c中的main函数作为入口函数,共享同一个编译器框架。cc1与cc1plus分别通过c-lang.c和cp-lang.c提供一个lang_hooks结构体,作为编译器框架对于语言的回调处理。

经过上述分析,我们可以对gcc的前端结构有一个大体的认识。对于说gcc调用g++,或者g++调用gcc,都是不准确的。

参考:GCC_frontend.pdf
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: