认识 C 的编译器和编译流程
GCC 的编译流程

我们写的 C 代码保存在扩展名是 .c 的文件,其实是一个纯文本文件。
- GCC(C 编译器之一)通过预处理器(Pre-Processing)把头文件展开到
hello.i文件中。 - 编译器(Compiling)把
hello.i文件转换成包含汇编代码的文件hello.s中。 - 汇编器(Assembling)把
hello.s文件转换成二进制文件——目标文件hello.o。 - 链接器(Linking)把库文件编译成 xx.o 文件,并与启动代码结合起来,最终生成一个可执行文件。
GCC 的编译步骤
第一阶段
把 hello.c(源文件)转换成 hello.i,gcc -E hello.c -o hello.i。

第 419 行的函数非常熟悉,在 IDE 中显示的代码也是这样。而这些代码都是来自于#include <stdio.h>头文件里的,也就是库文件。
.i 文件的内容与 .c 文件的内容有很大的不同。.c 文件中使用的 printf() 函数在源代码中好像是未定义,其实在 .i 文件中是把<stdio.h>的代码复制粘贴到了 .i 文件中。
第二阶段
把 hello.i 转换成 hello.s(汇编文件),gcc -S hello.i -o hello.s。

.s 文件还是一个文本文件,打开该文件查看,到这里就已经把源代码文件转换成了包含汇编指令的文件。
第三阶段
把 hello.s 转换成 hello.o,gcc -C hello.s -o hello.o。

.o 文件是一个目标文件,里面都是一堆二进制代码,但目前还不能被执行。打开这个文件一看,一堆红色的二进制,还有些许乱码。
第四阶段
生成可执行文件,gcc hello.o -o hello。

这里出现了一个错误,但从中得知,这一阶段链接器正在发挥它的作用:要把你编写的目标代码、系统的标准启动代码和库文件代码三个部分合并成一个文件,即可执行文件。
GCC 大致的步骤

认识 C 的编译器和编译流程的更多相关文章
- Gcc的编译流程分为了四个步骤:
http://blog.csdn.net/xiaohouye/article/details/52084770(转) Gcc的编译流程分为了四个步骤: 1.预处理,生成预编译文件(.文件): Gcc ...
- esp8266 SDK开发之编译流程
最近刚完成自己8266的小项目,已经发布在github上,有兴趣的朋友可以看一下 github地址:esp-ujn 1. 通过MQTT协议与服务器交互 2. 内置HTTP服务器,支持通过浏览器进行参数 ...
- EDKII Build Process:EDKII项目源码的配置、编译流程[三]
<EDKII Build Process:EDKII项目源码的配置.编译流程[3]>博文目录: 3. EDKII Build Process(EDKII项目源码的配置.编译流程) -> ...
- [uboot] (第四章)uboot流程——uboot编译流程
http://blog.csdn.net/ooonebook/article/details/53000893 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
- [uboot] (第二章)uboot流程——uboot-spl编译流程
http://blog.csdn.net/ooonebook/article/details/52949584 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
- 面试题----gcc的编译流程
gcc编译流程 一. 编译与处理指令: gcc -E hello.c -o a.c 如果不使用-o指定输出的文件,会默认输出到终端.所以建议使用同时使用-o选项. 还要注意:编译时会保留#pra ...
- 理解 C# 项目 csproj 文件格式的本质和编译流程
写了这么多个 C# 项目,是否对项目文件 csproj 有一些了解呢?Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢?更深入的,我能够自己扩展 csproj 的功能吗? ...
- GCC编译流程浅析
GCC-GCC编译流程浅析 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙 ...
- GCC 编译流程简介
GCC-GCC编译流程 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙全套 ...
- GCC编译流程及常用编辑命令
GCC 编译器在编译一个C语言程序时需要经过以下 4 步: 将C语言源程序预处理,生成.i文件. 预处理后的.i文件编译成为汇编语言,生成.s文件. 将汇编语言文件经过汇编,生成目标文件.o文件. 将 ...
随机推荐
- 【Scala】常见题目中Scala的使用
一.简单输出 BC2:打印一辆小飞机 object Main{ def main(args: Array[String]) { println(" ** ") println(&q ...
- python中文件操作相关基础知识
python中文件操作相关基础知识 文件的概念 1,文件的概念? 文件就是操作系统暴露给用户操作硬盘的快捷方式 , 当我们双击一个文件进行打开时,其实就是把硬盘中的数据加载到了内存中,然后展示给我们 ...
- DC-9靶场练习
Vulnhub靶场-DC-9 准备工作 kali和靶机都选择NAT模式(kali与靶机同网段) 下载链接:https://download.vulnhub.com/dc/DC-9.zip 一.主机发现 ...
- JavaScript冒泡排序+Vue可视化冒泡动画
冒泡排序(Bubble Sort)算是前端最简单的算法,也是最经典的排序算法了.网上JavaScript版本的冒泡排序很多,今天用Vue实现一个动态的可视化冒泡排序. 01.JavaScript冒泡排 ...
- Django TypeError at /login/ 'bool' object is not callable
代码: def login(request): if request.POST: username = request.POST.get('username') password = request. ...
- 基于.NetCore开发博客项目 StarBlog - (24) 统一接口数据返回格式
前言 开发接口,是给客户端(Web前端.App)用的,前面说的RESTFul,是接口的规范,有了统一的接口风格,客户端开发人员在访问后端功能的时候能更快找到需要的接口,能写出可维护性更高的代码. 而接 ...
- 简单易用的监控告警系统 | HertzBeat 在 Rainbond 上的使用分享
在现有的监控告警体系中 Prometheus + AlertManger + Grafana 一直是主流,但对于中小团队或个人来说,这种体系显的较为复杂.而 HertzBeat 能让中小团队或个人很快 ...
- 2022CSP-J线上游记
写在前面 安徽CSP取消了-- 去年CSP考炸的我本来想今年一雪前耻(bushi),结果-- T1 第一题大毒瘤! 首先观察数据可以分类如下两种情况: \(a = 1\) 直接输出\(1\),retu ...
- ZROI2
题解 ZROI2 暑假集训的第二次模拟赛,成绩..更加惨不忍睹.又滑了rk20,(#`-_ゝ-)(sk) 链染色 考场上想出了半正解,思路上期望得分80pts,代码得分0pts,(我这辣鸡代码能力╯︿ ...
- 通过Canal将云上MySQL数据同步到华为云ES(CSS)中
背景: A部门想将mysql中多张表join成一个sql查询语句,然后将结果同步到es中供搜索使用 环境信息: 源端mysql在阿里云上,有公网ip 目标端es在华为云上,三节点 操作步骤与目的: 配 ...