从文本文件到可执行文件发生了什么?(.o到.exe)

1、预处理

所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。当编译一个程序时,系统将自动调用预处理程序对程序中 # 号开头的预处理部分进行处理

头文件展开:将程序中所用的头文件用其内容来替换头文件名。

宏替换:扫描程序中的符号,将其 替换成宏所定义的内容。

去注释:去掉程序中的注释。

条件编译:筛选掉条件编译中的伪命令。

 

2、编译

这一阶段经过以下处理后在输出文件中,只有常量、变量的定义,以及C语言的关键字:

分析词法分析和语法,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。

代码优化:主要是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播以及无用赋值的删除,等等。

目标代码优化:最主要的是考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。另外根据机器硬件执行指令的特点(如流水线、RISC、CISC、VLIW等)而对指令进行一些调整使目标代码比较短,执行的效率比较高。

 

3、汇编

这一阶段是把汇编语言代码翻译成目标机器指令的过程。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。目标文件由段组成。通常一个目标文件中至少有两个段:

代码段:该段中所包含的主要是程序的指令,一般是可读和可执行的,但一般却不可写。

数据段:主要存放程序中要用到的各种全局变量或静态的数据,该段都是可读,可写,可执行的。

 

4、链接

完成文件中各种调用的函数以及库的连接,并将它们一起打包合并形成可执行文件。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿尔兹

如果觉得有用就推荐给你的朋友吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值