C:程序编译和链接的秘密

前言:


当我们写好了一个c程序,当程序直接运行起来,形成了一个可执行程序(.exe),机器又是怎么读懂它的?它背后仅仅是这么简单吗?今天,小编给大家讲解当程序运行起来背后的秘密,相信,读完本篇,你的功底会更深厚了,话不多说,正题开始:



正文:

在程序执行过程中,会出现两种环境,一种是翻译环境,一种是运行环境。

翻译过程:

翻译环境大致分为编译和链接两个大过程,而编译又分为预处理,预编译,汇编三个过程

在编译过程中,首先程序(.c)会经过预处理成(.i)为后缀的文件,再经过编译成(.s)的中间文件,在经过汇编变成(.o)为后缀的目标文件,再经过链接库成(.h)的文件。

在预处理阶段:程序会删除注释,会将#include 的库展开,将#define宏定义展开并替换,处理行号和文件名标识,以及处理条件编译指令等等。

在编译阶段:会对预处理文件进行一系列操作,比如语法分析,词法分析,语义分析并生成汇编代码.

在汇编阶段:程序会对汇编指令和机器指令一一对照,每一条汇编指令都对应一条机器指令。


链接过程:

链接过程是一个十分复杂的过程,计算机需要对多个独立翻译完成的.c文件链接到一起,比如地址,空间,以及相互调用之间的关系等,

比如在test.c文件中有函数add.c,在链接过程中程序会将test.c和add.c绘制成关系表,然后查找,等待最后链接的时候由 链接器根据引用的符号 add 在其他模块中查找 Add 函数的地址,然后将 test.c 中所有引用到 add 的指令重新修正,让他们的目标地址为真正的 Add 函数的地址。


运行环境

程序必须载入内存才能运行,在程序载入内存的过程中,一般通过操作系统来完成,调用main函数,调用运行时堆栈,执行程序。


文末:

希望看完此篇对你理解程序背后运行的过程,是如何将我们写的代码转换成机器语言,来运行的,又是如何实现的能够有帮助。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值