一、预编译 

他的命令是gcc -E main.c -o main.o   假设当前要编译的文件是main.c

1.将所有的#define删除,并展开所有的宏定义;

2.处理所有的预编译指令,例如:#if,#elif,#else,#endif;

3.处理#include预编译指令,将被包含的文件插入到预编译指令的位置;

4.添加行号信息文件名标识,便于调试;

5.删除所有的注释:

6.保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是

指示编译器完成一些特定的动作。

生成.i文件。

包括去注释 ,宏替换 ,头文件展开,条件编译

经编译后的.i文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件已经被插入到.文件中

二、编译:C语言——》汇编

他的命令是:gcc -s main.i -o main.s

1.扫描,语法分析,语义分析,源代码优化,目标代码生成,目标代码优化;

2.生成汇编代码;

3.汇总符号;

4.生成.s文件

三、汇编:汇编——》二进制

他的命令是:gcc -c main.s -o main.o

1.根据汇编指令和特定平台,把汇编指令翻译成二进制形式;

2.合并各个section,合并符号表;

3.生成.o文件

四、链接

1.合并各个.obj文件的section,合并符号表,进行符号解析;

2.符号地址重定位;

3.生成可执行文件

也可以从c源代码开始经过预处理,编译,汇编,链接直接输出可执行文件

他的命令是:gcc -c main.s -o main.o

转载于:https://www.cnblogs.com/smile-812/p/7723545.html

linux 编译程序的四个过程相关推荐

  1. 了解“预编译、编译、汇编、链接”这四个过程对你有很大帮

    转自:胡薇 了解"预编译.编译.汇编.链接"这四个过程对你有很大帮助-电子发烧友网 如有侵权,告知立马删除 补充:C语言条件编译及编译预处理阶段 - Rusty's code - ...

  2. Linux下Nginx编译安装过程详解

    Linux下Nginx编译安装过程详解 一.Nginx介绍 二.Nginx源码下载 1.打开Nginx官网 2.下载官网的源码包 三.Nginx源码安装 1.解压源码包 2.安装开发包组及环境 3.编 ...

  3. C++ —— C++程序编译的四个过程

    C++ -- C++程序编译的四个过程 g++是Linux下C++的编译器:我为什么会选择Linux下的g++编译器,就是因为g++可以看到程序从编译到运行的过程做了些什么.而VS等集成开发环境看不到 ...

  4. 从C源代码到可执行文件的四个过程:预处理、编译、汇编、链接

    从C源代码到可执行文件的四个过程:预处理.编译.汇编.链接 总览 我们将在Linux操作系统中,以C语言的Hello World程序为例,用gcc编译器分步执行这四个步骤. 我们有再熟悉不过的Hell ...

  5. Linux学习笔记(四)

    压缩和解压缩 zip和unzip命令 语法格式为:zip[选项] 参数 zip命令 可以用来解压缩文件,或者对文件进行打包操作.zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有". ...

  6. Linux开机引导与关机过程

    (转) Bootstrapping(引导) 是 Staring up a computer 的标准术语. 操作系统所提供的正常功能在启动过程中还不能使用,因此,计算机必须"通过其引导程序让自 ...

  7. Linux文件系统(四)文件缓存

    Linux文件系统 Linux文件系统(一)文件系统概述 Linux文件系统(二)磁盘文件系统 Linux文件系统(三)虚拟文件系统 Linux文件系统(四)文件缓存 Linux文件系统(四)文件缓存 ...

  8. 转:记一次linux oom内存溢出排查过程

    @转:记一次linux oom内存溢出排查过程 记一次linux oom内存溢出排查过程 2018年08月16日 14:13:49 enchanterblue 阅读数 4099更多 分类专栏: --- ...

  9. gcc编译的四个过程

    gcc是什么? GNU编译器套件(GNU Compiler Collection)包括C.C++.Objective-C.Fortran.Java.Ada和Go语言的前端,也包括了这些语言的库(如li ...

  10. Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)

    Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载) Linux LVM逻辑卷配置过程详解 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量, ...

最新文章

  1. 人工智能赋能智慧停车 准确预订车位
  2. 给初恋女孩的信....
  3. 【动态规划】[Uva11270]Tiling Dominoes
  4. [SoapUI] 通过SoapUI发送POST请求,请求的body是JSON格式的数据
  5. CIKM2021推荐系统论文集锦
  6. mysql sql能力_MySQL SQL优化
  7. JVM垃圾收集器(2)
  8. 虚函数和虚析构函数的实现原理--虚函数表
  9. #简单统计学#加权平均数
  10. Hybrid 开发:JsBridge - Web 和客户端的桥
  11. 前端实战项目:前端框架Vue3.0项目教程(一)Vue3.0环境的搭建
  12. 基于Matlab交通信号标志识别
  13. Lectra力克公司发布新战略 助力客户打造“工业4.0”智造流程
  14. 数据处理可视化的最有价值的 50 张图 (上)
  15. DEVC++安装后编程运行时老是提示“源文件未编译”
  16. 公测与奥运同行,云服务总线CSB:“连”无边界
  17. 正则表达式(菜鸟教程)
  18. 商详压测jjmeter配置
  19. 中兴echat_公网对讲机都有哪些平台?
  20. 《C++最佳实践》翻译与阅读笔记

热门文章

  1. .net微信公众号开发——群发消息
  2. java 8-8 接口的练习
  3. 5个提高效率的编程工作环境
  4. eclipse 改包名
  5. 慢日志之一:开启mysql慢查询日志并使用mysqldumpslow命令查看,分析诊断工具之四...
  6. 【Python 12】汇率兑换5.0(Lambda函数)
  7. JMETER 不同线程组 变量值 的参数传递(转)
  8. Java IO-InputStream家族 -装饰者模式
  9. 第八节,改善深层神经网络:超参数调试、正则化及梯度下降算法(中)
  10. spring4.x的一些新特性