gcc前端的基本结构

对于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结构体,作为编译器框架对于语言的回调处理。

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

以上博文转自http://blog.csdn.net/yuanlin2008/article/details/8283382

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值