自己动手构造编译系统:编译、汇编与链接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的工作细节。
相关文章
- Linux 后台开发必知的 I/O 优化知识总结
- 我们一起学学 Linux 安装 Docker 完整教程
- 你应该停止相信的关于 Linux 的七个神话
- Go 语言的函数是“一等公民”?
- 已超越 RHEL!Rocky Linux 很强
- Windows 12:发布日期,价格以及我们所知道的其他所有内容
- 除了媒体查询外,你知道还有样式查询吗?
- 从零实现原子服务一键分享,免安装!
- Windows 11一周年!比Windows 10到底好在哪里?
- 三分钟掌握Actor和CSP模型
- Spring循环依赖的“夺命连环问”,你能招架几波?
- DevEco Studio V3.0 Beta4 低代码开发系列之初体验
- 为何Linux桌面系统这么让人难以割舍?
- 你不知道的Vscode之项目约束 | 仓库配置
- 面向跨语言的操作系统日志异常检测技术研究与实现
- 在 Linux 上学习 C 语言的五种方式
- CentOS项目变更后,金融企业如何应对?
- DevOps成熟度模型:当今世界的趋势和优秀实践
- 如何从 Debian 稳定版切换到 Debian 测试版
- 如何编写 C 程序在 Linux 上创建音乐播放列表