c文件编译过程

编译的完整过程:c源程序——预编译处理(生成.c文件)——编译、优化程序(生成.S\.s\.asm文件)——汇编程序(生成.obj\.o\.a\.ko文件)——链接程序(生成.exe\.slf\.axf\.hex文件)
预处理:将所有的伪指令和特殊符号进行替换,经过替换,生成一个没有宏定义,没有条件编译指令,没有头文件,没有特殊标示符的输出文件,此文件和源代码含义相同,但是内容不同。

1.读取C程序。对其中的伪指令(以#开头的指令)和特殊符号进行处理。
伪指令主要包括以下四个方面;
1)宏定义指令#define,#undef
#undef用来取消先前用#define定义的标示符,如果此标示符先前没有被定义,则此条指令被忽略,#define定义的宏一直作用#undef取消,否则一直在作用域内有效
2)条件编译指令#ifdef,#ifndf,#else,#elseif,#edfif
3)头文件包含指令#include
4)预编译程序可以识别的一些特殊标示符,如LINE预编译程序认为是当前程序的行号。

编译优化程序:编译程序所要做的工作就是通过词法分析和语法分析,再确认所有指令都复合语法规则的基础上,将其翻译成等价的中间代码或者汇编代码。优化处理编译是系统中比较艰深的技术,和汇编软件有很大关系。

汇编:汇编过程就是将编译好的汇编语言代码翻译成等价的机器代码,对于被编译的所有源文件经过这一处理都将得到相应的目标文件。目标文件存放的也就是与c源程序等价的机器代码。

目标文件由段组成,一般包含代码段和数据段,代码段主要是程序指令,数据段用来存放全局变量和静态变量,以及一些常量。

链接:将目标代码与程序里调用的库函数(相对应的有库.O的文件)对应的代码链接起来形成可执行的文件。某一个源文件引用了另一个源文件里的函数或者符号,或者引用了库文件里的函数,就需要使用连接程序来解决问题。 链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。


库函数:系统提供的供开发人员开发时调用的完成特定功能的函数,库文件由软件提供商的库函数的结合,一般就是.O的目标代码
 根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种:
(1)静态链接
在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。
(2) 动态链接
在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。
对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值