Linux系统下C语言程序编译过程

news/2024/10/5 3:29:27

Linux系统下C语言程序编译过程

img

C语言程序编译过程:源程序 ---- 预处理 --- 编译 --- 汇编 --- 链接 --- 可执行文件

1.预处理

对源码进行简单的加工,GCC编译器会调用预处理器cpp对程序进行预处理,其实就是解释源程序中所有的预处理指令,如#include(文件包含)、#define(宏定义)、#if(条件编译)等以#号开头的预处理语句。

这些预处理指令将会在预处理阶段被解释掉,如会把被包含的文件拷贝进来,覆盖掉原来的#include语句,把所有的宏定义展开,所有的条件编译语句被执行,GCC还会把所有的注释删掉,添加必要的调试信息。

预处理指令: gcc -E xxx.c -o xxx.i 会生成预处理文件 xxx.i

2.编译

就是对经过预处理之后的.i文件进行进一步翻译,也就是对语法、词法的分析,最终生成对应硬件平台的汇编文件,具体生成什么平台的汇编文件取决于编译器,比如X86平台使用gcc编译器,而ARM平台使用交叉编译工具arm-linux-gcc。

编译指令 : gcc -S xxx.i -o xxx.s 会生成汇编文件 xxx.s

3.汇编

GCC编译器会调用汇编器as将汇编文件翻译成可重定位文件,其实就是把.s文件的汇编代码翻译为相应的指令。

编译指令 : gcc -c xxx.s -o xxx.o 会生成目标文件 xxx.o

4.链接

经过汇编步骤后生成的.o文件其实是ELF格式的可重定位文件,虽然已经生成了指令流,但是需要重定位函数地址等,所以需要链接系统提供的标准C库和其他的gcc基本库文件等,并且还要把其他的.o文件一起进行链接。-lc -lgcc 是默认的,可以省略。

编译指令:gcc xxx.o... -o xxx -lc -lgcc 会得到可执行文件 xxx // l是lib的缩写

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

locust压测的基本使用

locust压测的基本使用这里介绍的是在本地启动locust以及做后续压测的流程以及各个参数含义一、启动locust执行命令 locust -f **.py (python脚本)如下图: 二、locust的UI界面1、启动界面8089是该服务启动的端口号,如果是本地启动,可以直接在浏览器输入http://localhost:80…

如何解决网页无响应问题

如何解决网页无响应问题 描述 少数电脑在运行网页相关的自动化应用时,会碰到 "网页无响应" 的提示。 解决方案 将 Chrome 的 "使用硬件加速模式(如果可用)" 选项关闭没有找到想要的结果?

Plagiarism

论文造假的,学术造假的定义学习。 ### Plagiarism and Academic Integrity Overview #### A. Brainstorming Activities **Word Cloud:**- For "Writing": narrative, descriptive, expository, argumentative, essay, report, novel, short story, poetry, structu…

泰山派学习11--字符设备驱动

1、字符设备定义应用程序按字节/字符来读写数据的设备,不支持随机存取数据,系统直接从设备读取/写入每一个字符。 2、字符设备抽象Linux内核中将字符设备抽象成一个具体的数据结构(struct cdev),理解为字符设备对象。 字符设备的打开、读写、关闭等操作接口(file_operations…

存入数据库的时间不对

存入数据库的时间和当前时间相差了8个小时?解决更改项目数据库连接串 GMT 为 Asia/Shanghai。如下图:GMT:为格林尼治天文台时间。与东八区,也就是北京时间相差8个小时。这里应该设置为东八区时间,即是Asia/Shanghai。

最低50元的京东云轻量服务器体验

‍ 最低50元的京东云轻量服务器体验:最低的价格,最差的体验。 ​​ 体验​​ 看路人评论 ​​ ‍ 处处是bug ‍ 从自己的机器上ssh到服务器,刚连接的时候正常 ​​ 用了一会,终端没反应了(非禁止画面)这是不是断连? ​​ ‍ 然后是网页的控制台 ​​vim 搜索 alias ,开…

UE Puerts 在 Android 的调试方法

配置流程 在 JsEnv.Build.cs 添加 WITH_INSPECTOR 编译添加这个宏就开启了全平台调试功能看到这里就知道 V8Inspector 之前仅在三个平台会编译,现在会在任意平台编译了 打包的时候会发现存在编译错误(如果没有就是后续 Puerts 版本修复了这个问题),接下来修复这个错误(没有…

django中orm的使用

Orm是django连接mysql数据库的工具,用户可以通过orm实现对数据库的增删改查。 1.启动mysql 创建数据库 在cmd中输入mysql -uroot -p 后再输入密码运行mysql 然后创建数据库:create database 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 2 让django链接数据库 在…