一,预编译

操作步骤:gcc -E hello.c -o hello.i

主要作用:

处理关于 “#” 的指令

【1】删除#define,展开所有宏定义。例#define portnumber 3333

【2】处理条件预编译 #if, #ifdef, #if, #elif,#endif

【3】处理“#include”预编译指令,将包含的“.h”文件插入对应位置。这可是递归进行的,文件内可能包含其他“.h”文件。

【4】删除所有注释。/**/,//。

【5】添加行号和文件标识符。用于显示调试信息:错误或警告的位置。

【6】保留#pragma编译器指令。(1)设定编译器状态,(2)指示编译器完成一些特定的动作。

二,编译(编译器主要做了什么)

操作步骤:gcc -s hello.c -o hello.s

主要作用:1.扫描(词法分析),2.语法分析,3.语义分析,4.源代码优化(中间语言生成),5.代码生成,目标代码优化。

【1】将源代码程序输入扫描器,将源代码的字符序列分割成一系列记号。例array[index] =  (index + 4) * (2 + 6);

【2】基于词法分析得到的一系列记号,生成语法树。

【3】由语义分析器完成,指示判断是否合法,并不判断对错。又分静态语义:隐含浮点型到整形的转换,会报warning,

动态语义:在运行时才能确定:例1除以3

【4】中间代码(语言)使得编译器分为前端和后端,前端产生与机器(或环境)无关的中间代码,编译器的后端将中间代码转换为目标机器代码,目的:一个前端对多个后端,适应不同平台。

【5】编译器后端主要包括:代码生成器:依赖于目标机器,依赖目标机器的不同字长,寄存器,数据类型等

目标代码优化器:选择合适的寻址方式,左移右移代替乘除,删除多余指令。

三,汇编

操作步骤:gcc -c hello.c -o hello.o

主要作用:汇编器是将汇编代码转变成可以执行的指令,生成 目标文件。

四,链接

操作步骤:gcc hello.o -o hello

主要作用:通过编译器的5个步骤后,我们获得目标代码,但是里面的各个地址还没有确定,空间还没有分配。

链接过程主要包括:地址和空间的分配,符号决议和重定位。

地址和空间:略

符号决议:也可以说地址绑定,分动态链接和静态链接,

重定位:假设此时又两个文件:A,B。A需要B中的某个函数mov的地址,未链接前将地址置为0,当A与B链接后修改目标地址,完成重定位。

转载于:https://www.cnblogs.com/CodeWorkerLiMing/p/9613606.html

gcc——预处理(预编译),编译,汇编,链接相关推荐

  1. 详细介绍预处理#define和编译链接等有关知识

    目录 程序环境和预处理 程序环境 翻译环境 介绍翻译各阶段的工作 运行环境 预处理 预定义符号 #define #define定义标识符 样例 注意点 #define定义宏 样例 注意点 #defin ...

  2. gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

    例子:由多个源文件组成的C程序,经过编辑.预处理.编译.链接等阶段才能生成最终的可执行程序.此过程中,在__c__阶段可以发现被调用的函数未定义. A. 编辑和预处理 B. 预处理 C. 编译 D. ...

  3. 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  4. C语言的预处理、编译、汇编、链接

    2019独角兽企业重金招聘Python工程师标准>>> 一.预处理 预处理指令的执行主要包含下列事情: 1.头文件的包含 2.注释的删除 3.宏定义的替换 4.条件编译的选择 指令: ...

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

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

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

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

  7. 【Linux】预编译,编译,汇编,链接的四过程

    第一个阶段是预编译阶段,在正式的编译阶段之前进行.预处编译段将根据已放置在文件中的预处理指令来修改源文件的内容.如#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中.宏替换也 ...

  8. c语言程序的生命周期(编写、预处理、编译、汇编、链接、执行)

    目录 程序的生命周期 一.引言 二.程序经历的六个阶段 1.阶段一:编辑(Edit) 2.程序编译系统(Programs Compilation System) 阶段二:预处理(Preprocess) ...

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

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

  10. 编译的四个过程-预处理、编译、汇编、链接

    编译的四个过程-预处理.编译.汇编.链接 程序编译成可执行文件的过程可分为四步:预处理.编译.汇编.链接.下面将以main.c为目标文件进行详细讲解: 1.预处理: 通过gcc -E main.c - ...

最新文章

  1. 最常见的 35 个 Python 面试题及答案
  2. VMware 虚拟化编程(3) —VMware vSphere Web Service API 解析
  3. 进阶指令——df指令(作用:查看磁盘的空间)、free指令(作用:查看内存使用情况)、head指令(作用:查看一个文件的前n行,如果不指定n,则默认显示前10行)、tail指令、less指令
  4. frps与frpc的区别
  5. MAC地址如何在windows与unix下查看?
  6. plot函数_时间序列:python移动窗口函数前言
  7. kafka 支持发布订阅
  8. “智能报表系统”的建设经验--东北证券
  9. PHP 报错 Use of undefined constant prop_values - ass...
  10. 如何从零学习PostgreSQL Page结构
  11. 野生前端的数据结构练习(10)希尔排序,归并排序,快速排序
  12. JAVA :RESTLET开发实例(一)基于JAX-RS的REST服务
  13. linux目标文件链接命令,ld 命令:将目标文件链接为可执行程序 - dute.org
  14. 第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制...
  15. CRC校验算法的Verilog实现
  16. php集成开发环境哪个最好,推荐几个好用的PHP集成开发环境
  17. 不怕被群主踢,安心分享小游戏续命,上分好办法!
  18. windows 7 开机错误 未能连接到一个Windows服务
  19. [转贴]请珍惜你身边爱你的人
  20. 6-3 选队长 (5 分)

热门文章

  1. mybatis 创建session, 缓存, 执行SQL
  2. 我的世界java版怎么打不开_JAVA版我的世界打不开,求助!
  3. 网站核心关键词一定要控制在五个之内更方便集中优化
  4. 网站建设想要出类拔萃还要从基础上做创新
  5. spwm逆变器双极性matlab教程,基于MATLAB/Simulink的SPWM逆变电源的建模与仿真
  6. r语言聚类分析_「SPSS数据分析」SPSS聚类分析(R型聚类)的软件操作与结果解读...
  7. springboot默认开启事务吗_香~Spring Boot 应用也可以有配置中心。
  8. SpaceVim snippets C配置
  9. 开发日记-20190712 关键词 读书笔记 《Perl语言入门》Day 8
  10. 开发日记-20190425 关键词 gradle基础学习 7年之约 启动篇