C语言的预处理、编译、汇编、链接
2019独角兽企业重金招聘Python工程师标准>>>
一、预处理
预处理指令的执行主要包含下列事情:
1.头文件的包含
2.注释的删除
3.宏定义的替换
4.条件编译的选择
指令:gcc -E test.c -o test.i
/* 调用的是预处理器cpp, -E:只进行预处理操作,-o:输出到<文件> , .i表示产生的临时文件 Intermediate */
二、编译
编译之前,C语言编译器会进行词法分析、语法分析(-fsyntax-only)。
在确认所有的指令都符合语法规则之后,将其翻译成相应的后缀为S的汇编文件。
指令:gcc -S test.i -o test.S
/* 调用的是编译器ccl, -S:编译到汇编语言,不进行汇编和链接, .S:表示汇编文件,注意于.s汇编文件的区别 */
.s :汇编语言源程序;汇编
.S:汇编语言源程序;预处理,汇编
小写的s文件,在后期阶段不在进行预处理操作,所以我们不能在这里面写预处理的语句在里面
大写的S文件,还会进行预处理、汇编等操作,所以我们可以在这里面加入预处理的命
三、汇编
在编译与汇编之间,编译器通常还会做一些优化操作。
汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程
指令:gcc -c test.S -o test.o
/* 调用的是汇编器as,-c:编译、汇编到目标代码,不进行链接, .o表示产生目标文件, object
此时用file查看test.o文件的类型为ELF 32-bit LSB relocatable类型,这是可重定位的格式 */
四、链接
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个 源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。
函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。
指令:gcc test.o -o test
/* 用file查看test文件类型为:ELF 32-bit LSB executable,这是可以被执行的文件格式 */
转载于:https://my.oschina.net/u/920274/blog/2875477
C语言的预处理、编译、汇编、链接相关推荐
- 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- C语言 程序的翻译 预处理 编译 汇编 链接 #define详解
1.程序的翻译环境和执行环境 执行环境:所在操作系统的平台 win10 win11 linux 翻译环境:MSVC gcc g++ 你的vs 2019 和2022 是集成开发环境把编辑器编译器全部给你 ...
- 一个c语言程序只要编译和链接没有错误,一个 C 语言程序只要编译和链接没有错误,程序运行结果就肯定正确...
一个 C 语言程序只要编译和链接没有错误,程序运行结果就肯定正确 更多相关问题 网页表单中不能插入表格.() 要想在一个网页中嵌套另外一个网页,一般可以使用页内框架.() 贸易也是一种特殊的技术.() ...
- stm32启动过程、cortex-m3架构、堆栈代码位置、编译汇编链接分析
分析 一. 寄存器.架构.工作流程 1. 寄存器架构 二 .总线与各个部件之间的关系(主要是I-Code Bus.D-Code Bus.System Bus) 体系结构:哈佛结构与冯诺依曼结构的区别 ...
- C语言中的编译,链接,运行简单复习
预编译:首先是将源代码文件hello.h和相关的头文件,如stdio.h等被编译器Cpp预编译成一个.i文件.主要处理那些源文件中以"#"开始的预编译指令,如"#incl ...
- C语言中的编译与链接
尽管Kernighan所编写的程序十分简单,但为了运行这个程序所涉及和包含的内容比想象中的要多,首先要生成一个含上面程序的.c文件,接下来需要把程序转化为机器可执行的形式,对于C语言来说主要包含以下三 ...
- 反编译与反汇编、C++编译过程,包括预编译--汇编--编译--链接
参考:C/C++程序编译流程(预处理->编译->汇编->链接) - ProLyn - 博客园 反汇编和反编译的区别_代码小卒_新浪博客 反汇编与反编译: 汇编:是把汇编源程序转变为目 ...
- 使用gcc编译和链接C语言程序,用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)...
转载自:http://daimajishu.iteye.com/blog/1089740 对gcc认识的一篇文章,就转载了,截取了自己感兴趣部分. 一,GCC编译器简介 虽然我们称Gcc是C语言的编译 ...
- c语言编辑编译链接,C语言的“编译、链接”
我们写的代码,仅仅是文本文件(txt),不管后缀怎么变,终究是文本文件,计算机只能显示,不能做事(执行). 文本文件通过"编译.链接",成为可执行文件(windows下是exe): ...
- C语言——C程序编译过程
C语言目录: 1. 概述 2. 数据类型 3. 量 4. 运算符 5. 流程控制 6. 函数 7. C程序编译过程 8. 文件 9. 内存管理 #mermaid-svg-5eSYOEOTEbZDntT ...
最新文章
- 新物质?新材料?探索元素周期表,机器学习帮你找!
- oracelp---随意 记录(nvl)
- matlab 神经网络ann用于分类方法
- 爬虫实战:过年你被催婚啦吗?爬取相亲网站,看看当下年轻小姐姐的择偶观。
- 条形图坐标轴_解密咨询报告中常见的双层条形图的制作方法
- python笔记小白入门_Python 笔记:全网最详细最小白的Class类和实例详解
- paip.python错误解决2
- SSH框架java写接口_SSH框架的搭建+JPA接口
- 用什么软件测试微信朋友圈被屏蔽,怎么检测朋友圈被屏蔽?清师傅帮你
- 传统图像分割方法详解
- Javascript 实现汉字简繁体互相转换
- 5.1.2全景声音箱摆位_全景声音响系统,音箱应该如何摆位?(5.1.2、5.1.4篇)
- HTML table表格 固定表头 tbody加滚动条
- c语言变量周围堆栈损坏csdn,围绕变量“输入”的堆栈已损坏(Stack around the variable 'input' was corrupted)...
- 美术大拿经验谈:游戏美术不仅是美术
- Unity2D教程:地图制作Tilemap
- 作为测试人员,你需要掌握哪些,常用软件测试工具?
- 微信公众号开发之如何将本机IP映射成外网域名
- 淘宝,速卖通,天猫同理,商品视频下载过程分享,2019/10/21更新
- 全套Office办公软件WORD/PPT/EXCEL视频教程 每日更新中
热门文章
- boost::hana::any用法的测试程序
- boost::gil::threshold_binary用法的测试程序
- boost::geometry模块实现显示不同类型的点的测试程序
- boost::fusion::convert用法的测试程序
- GDCM:gdcm::IOD的测试程序
- VTK:可视化之CollisionDetection
- VTK:Utilities之LUTUtilities
- 嵌入式Linux的Qt
- OpenG 轮廓检测
- C++ 面向对象的三大特性和五个原则?