开发者社区> 华章计算机> 正文

自己动手构造编译系统:编译、汇编与链接1.3 GCC的工作流程

简介:
+关注继续查看

1.3  GCC的工作流程

  

      在着手构造编译系统之前,需要先介绍编译系统应该做的事情,而最具参考价值的资料就是主流编译器的实现。GNU的GCC编译器是工业化编译器的代表,因此我们先了解GCC都在做什么。

  我们写一个最简单的“HelloWorld”程序,代码存储在源文件hello.c中,源文件内容如下:

#include<stdio.h>

int main()

{

     printf("Hello World!");

     return 0;

}

  如果将hello.c编译并静态链接为可执行文件,使用如下gcc命令直接编译即可:

$gcc hello.c –o hello -static

  hello即编译后的可执行文件。

  如果查看GCC背后的工作流程,可以使用--verbose选项。

$gcc hello.c –o hello –static --verbose

  输出的信息如下:

$cc1 -quiet hello.c -o hello.s

$as -o hello.o hello.s

$collect2 -static -o hello \

     crt1.o crti.o crtbeginT.o hello.o \

     --start-group libgcc.a libgcc_eh.a libc.a --end-group \

     crtend.o crtn.o

  为了保持输出信息的简洁,这里对输出信息进行了整理。可以看出,GCC编译背后使用了cc1、as、collect2三个命令。其中cc1是GCC的编译器,它将源文件hello.c编译为hello.s。as是汇编器命令,它将hello.s汇编为hello.o目标文件。collect2是链接器命令,它是对命令ld的封装。静态链接时,GCC将C语言运行时库(CRT)内的5个重要的目标文件crt1.o、crti.o、crtbeginT.o、crtend.o、crtn.o以及3个静态库libgcc.a、libgcc_eh.a、libc.a链接到可执行文件hello。此外,cc1在对源文件编译之前,还有预编译的过程。

  因此,我们从预编译、编译、汇编和链接四个阶段查看GCC的工作细节。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python编程:利用上下文管理器管理MySQL的链接对象
Python编程:利用上下文管理器管理MySQL的链接对象
34 0
C#编程-117:文件流FileStream类
C#编程-117:文件流FileStream类
32 0
[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)
原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ——通过知识共享树立个人品牌。
996 0
C/C++程序编译流程(预处理-&gt;编译-&gt;汇编-&gt;链接)
程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。
818 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载