行程单图片python预处理_GCC编译过程(预处理-gt;编译-gt;汇编-gt;链接)

ac72cb2904c31e0a6a4ecb866aee33aa.png

前言

如果你使用集成环境开发。那么你点击编译按钮就可生成可执行文件。但是C程序从源代码到二进制行程序都经历了那些过程?你知道吗?这些过程集成开发环境在点击编译按钮后都做完了,如果编译没有出错,即可生成可执行文件。本文将以Linux下C语言的编译过程为例。对编译过程进行讨论。

编译一个C程序代码

下面以Linux环境下的test.c为例,test.c里的代码为:

#include <stdio.h>int main(int argc, char const *argv[])
{printf("hello 程序猿编码n");return 0;
}

编译输出:

2e493afbd21a442a2facfbe47f86adf9.png

这个过程如此熟悉,以至于觉得编译是一件很简单的事。事实真的如此吗?我们来细看一下C语言的编译过程到底是怎样的。

GCC编译过程:

a08058a3e16fb42ca17e81ec66f6aee0.png

图片来源于:GCC和Make编译,链接和构建C/C ++应用程序

上述gcc命令其实依次执行了四步操作:

1.预处理(Preprocessing)
2.编译(Compilation),
3.汇编(Assemble),
4.链接(Linking)。

预处理

以“#”号开头的预处理指令如包含#include,宏定义制定#define等。在源程序中这些指令都放在函数之外,而且一般放在源文件的前面。

使用预处理器把源文件test.c经过预处理生成test.i文件。

预处理的命令为:

gcc -E test.c -o test.i

上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程;-o是指定输出文件名。在本例中,预处理结果就是将stdio.h 文件中的内容插入到test.c中了。

预处理生成的是test.i的文本文件,这个文本文件是可以直接通过cat命令进行文本文件查看的。

7a066672ea06d00eab6239a3f86c5a31.png

对比预处理、文本文件、可执行文件的大小

d5f96f6e57f387b0aa854e497e131ee2.png

经过预处理之后代码体积会大很多,相当于可执行文件一倍大小。预处理之后的程序还是文本,可以用文本编辑器打开。

编译

这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理文件(test.i)之后的程序转换成特定汇编(test.s)代码的过程。

编译的命令为:

gcc -S test.i -o test.s

上述命令中-S让编译器在编译之后停止,不进行后续过程;-o是指定输出文件名。编译过程完成后,将生成程序的汇编代码test.s,这也是文本文件。

e888e26d9a4b8f3fb872195d04b41543.png

查看汇编代码和代码大小:

4fb037b958a57d22d6e90968948b7491.png

编译成汇编文件大小已经非常小了,没有像预处理的时候文件大小这么臃肿。

cat test.s

40ea0cc6e4057de82371e4f120e55ff4.png

里面汇编是什么意思,就不要问我了。哈哈~

汇编

汇编过程将上一步的汇编代码转换成机器码,这一步产生的文件叫做目标文件,是二进制格式。

编译的命令为:

gcc -c test.s -o test.o

cf8bb5dc752792f06cf1897d4c828444.png

部分内容截图如下:

cda757455d169ab5b6d550c09951da82.png

链接

链接过程使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

链接过程的命令为:

gcc test.o -o test

2a7c627d23bee4d1418cb3ab08cca7d6.png

总结

生成可执行程序过程为成四个步骤:

1、由.c文件到.i文件,这个过程叫预处理。
2、由.i文件到.s文件,这个过程叫编译。
3、由.s文件到.o文件,这个过程叫汇编。
4、由.o文件到可执行文件,这个过程叫链接。

欢迎关注微信公众号“程序猿编码” ,这里Linux c/c++ 、Python、Go语言、数据结构与算法、网络编程相关知识,常用的程序员工具。每日00:10之前更新新闻简报,一份简报,纵览天下事!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqlite查询乘以某列如果是null就换成_大数据之Hive group by with cube/rollup分组查询...

group bysql 查询时&#xff0c;我们常将聚合函数和group by 结合起来对某一个或多个字段进行分组查询&#xff0c;例如&#xff1a;select addcode,count(distinct sbtid)uv from tb_hive_window group by addcode;---------------| addcode | uv |---------------| 0002 …

可以操作excel吗_Excel快速填充,这四种方法你会吗?操作逆天告别加班

在Excel的表格制作中&#xff0c;仅仅会复制粘贴可是不够的&#xff0c;还需要掌握更多的技能&#xff0c;来提升我们的工作效率&#xff01;我们在进行Excel报表制作的时候&#xff0c;如果要批量填充序号&#xff0c;有多少种方法呢&#xff1f;下面给大家简单介绍一下这四种…

2G---5G与未来天线技术

本文来源&#xff1a;滤波器过去二十年&#xff0c;我们见证了移动通信从1G到4G LTE的转变。在这期间&#xff0c;通信的关键技术在发生变化&#xff0c;处理的信息量成倍增长。而天线&#xff0c;是实现这一跨越式提升不可或缺的组件。按照业界的定义&#xff0c;天线是一种变…

python操作csv文件第7行开始的数据_Python教程-Python读写CSV文件

前言 本教程学习在Python中使用CSV文件。CSV&#xff08;逗号分隔值&#xff09;格式是在电子表格和数据库中使用的非常流行的导入和导出格式。Python语言包含该模块&#xff0c;该模块具有用于读取和写入CSV格式的数据的类。csv 使用csv.reader&#xff08;&#xff09;读取CS…

基于STM32的高精度频率计设计

前言 本文记录了博主完成的一个课设作品&#xff08;学分为3.5分&#xff09;&#xff0c;题目需要利用ARM做出一个高精度频率计。具体要求如下&#xff1a; 1&#xff09;实现对10M以内数字信号频率的高精度测量&#xff0c;频率测量误差不大于0.01%&#xff1b; 2&#xff0…

数学的意义(一)

来源&#xff1a; 数学职业家数学既是一种文化、一种“思想的体操”&#xff0c;更是现代理性文化的核心。马克思说&#xff1a;“一门科学只有当它达到了能够成功地运用数学时&#xff0c;才算真正发展了。”在前几次科技革命中&#xff0c;数学大都起到先导和支柱作用。我们不…

python弹球小游戏程序_Python实现弹球小游戏

本文主要给大家分享一个实战项目&#xff0c;通过python代码写一款我们儿时大多数人玩过的游戏---小弹球游戏。只不过当时&#xff0c;我们是在游戏机上玩&#xff0c;现在我们通过运行代码来玩&#xff0c;看看大家是否有不一样的体验&#xff0c;是否可以重温当年的乐趣呢&am…

强化学习决策生成-以 Q-learning 为例

强化学习决策生成-以 Q-learning 为例

【数据中台】关于数据中台系统,需要了解哪些技术?

来源&#xff1a;产业智能官国家建材大数据研究中心今天让我们全面解读中台&#xff0c;包括企业为什么要平台化&#xff0c;目前中台都有哪些形式&#xff0c;实施中台系统的优势、面临的问题以及建议都有哪些&#xff1f;中台这个概念早期是由美军的作战体系演化而来的&#…

什么是启发式?什么是产生式?

来源&#xff1a;人机与认知实验室一般而言&#xff0c;机器常常被设定从已知推未知&#xff0c;而人们不时会从未知&#xff08;假设&#xff09;推未知&#xff0c;特殊情形下也有从未知推已知的&#xff0c;这些推导中常见的有产生式和启发式&#xff0c;那么究竟什么是产生…

Maven项目错误解决小结

http://blog.csdn.net/typa01_kk/article/details/49185759 Maven项目错误解决小结 注&#xff1a;整理错误&#xff0c;不喜欢为了一个小问题&#xff0c;占篇幅&#xff0c;所以请CtrlF自己查看&#xff0c;定位问题&#xff0c;愿为解决. 注&#xff1a;网络上的错误解决经验…

python交并补_python两个列表求交、并、差

在python中&#xff0c;如果有两个数组&#xff0c;分别要求交集&#xff0c;并集与差集&#xff0c;怎么实现比较方便呢&#xff1f; 当然最容易想到的是对两个数组做循环&#xff0c;即写两个for循环来实现。这种写法大部分同学应该都会&#xff0c;而且也没有太多的技术含量…

可怕!贺建奎论文手稿意外曝光!基因编辑实验充满谎言

来源&#xff1a;学研加中国双胞胎的基因编辑可能已经失败&#xff0c;并产生了意想不到的突变。这是科学家们阅读了原南方科技大学副教授贺建奎论文手稿后&#xff0c;得出的结论。贺建奎基因编辑婴儿事件2018年11月26日&#xff0c;一则《世界首例免疫艾滋病的基因编辑婴儿在…

l360废墨收集垫清零_知识分享003:EPSON L360打印机出现故障-废墨计数清零

故障现象&#xff1a;客户的EPSON L360打印机出现故障&#xff0c;纸张和墨水报警灯交替闪烁。无法打印原因分析&#xff1a;确定纸张和墨水的是处于正常状态&#xff0c;上网查了&#xff0c;可能是废墨收集到达了上限。需要做清零处理。解决方法&#xff1a;根据这个型号EPSO…

R语言-处理异常值或报错的三个示例

R语言-处理异常值或报错的三个示例 之前用rvest帮人写了一个定期抓取amazon价格库存&#xff0c;并与之前价格比较的小程序&#xff0c;算是近期写过的第一个完整的程序了。里面涉及了一些报错的处理。 这里主要参考了stackoverflow上的以下问答&#xff1a; How to skip an er…

联想e580没有声音_现在你可以购买通过 Linux 认证的联想 ThinkPad 和 ThinkStation

曾经有一段时间&#xff0c;ThinkPad 是 Linux 用户的首选系统。但那是在 ThinkPad 还是 IBM 的产品的时候。来源&#xff1a;https://linux.cn/article-12283-1.html作者&#xff1a;Abhishek Prakash译者&#xff1a;Xingyu.Wang曾经有一段时间&#xff0c;ThinkPad 是 Linux…

UC伯克利教授Stuart Russell人工智能基础概念与34个误区

来源&#xff1a;数据简化DataSimp数据简化DataSimp导读&#xff1a;UC伯克利教授StuartRussell人工智能基础概念与34个误区&#xff0c;Russell是加州大学伯克利分校人工智能系统中心创始人兼计算机科学专业教授&#xff0c;同时还是人工智能领域里「标准教科书」《人工智能&a…

装入归档文件时出现了一个错误linux_静态链接与动态链接(Linux)

前言上一篇分享了静态链接与动态链接的实验(Windows下)。这一篇分享Linux下的笔记&#xff0c;同时对上一篇笔记做一个补充。首先&#xff0c;我们把静态链接与动态链接做一个这样子的比喻&#xff1a;把链接过程看做我们平时学习时做笔记的过程。我们平时学习时准备一本笔记本…

9008刷机怎么刷_OV快捷进入高通进9008或fastboot模式刷机解锁,和MTK关机解锁

不喜略过。高通进9008刷机解锁&#xff1a;关机状态下&#xff0c;同时按音量下键上键插线进9008 .(注意安装手机驱动)高通进fastboot模式解锁&#xff1a;旧机型(平台上选择不到机型的)进fast解锁&#xff0c;关机状态 音量下键开机键 MTK关机解锁:关机状态下按音量上键&#…

10年内,19个关键技术将改变世界

来源&#xff1a; 科技联盟技术中心据国外媒体报道&#xff0c;从无人驾驶汽车到机器人工人&#xff0c;在我们熟悉所有这一切之前&#xff0c;未来正迎面走来。根据世界经济论坛全球议程理事会关于《未来软件与社会》的一份报告&#xff0c;到2025年前&#xff0c;很多新兴技术…