【C++学习】C语言编译链接过程

将一个后缀为.c的源文件转换为可执行文件的过程就是编译与链接。

编译:将文本形式的源代码转换为机器语言形式的目标文件的过程。
链接:将目标文件、操作系统的启动代码和用到的库文件结合为最终可执行代码的过程。

对于编译阶段分为两个阶段:编译、汇编;编译阶段又分为预处理阶段、编译优化阶段。

预处理阶段:预处理阶段根据文件中的预处理指令来对源文件进行修改。主要包括:宏定义指令、条件编译指令、头文件包含指令、特殊符号。因此预编译阶段就是对源文件的替换过程,生成一个没有宏定义、没有条件编译、没有特殊符号的输出文件。

编译优化阶段:
经过预编译阶段的输出文件中只有常量,一般都是一些指令,编译程序需要进行语法分析和词法分析,确认所有指令都是符合语法规则之后,将其翻译成等价的中间代码和汇编代码。
优化一部分是对中间代码的优化,另一部分是针对目标代码的生成进行的。对于前一种优化,主要是删除公共表达式,循环优化,比如代码外提(LICM,将循环体中循环不变的语句或者表达式移出到循环体外面),强度消弱,复写传播等。后一种类型的优化同机器的硬件结构密切相关,最主要的是考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数(要知道内存资源对于计算机至关重要,控制好它可以大幅提高计算机的运算速度)。另外,如何根据机器硬件执行指令的特点(如流水线、RISC、CISC、VLIW等)而对指令进行一些调整使目标代码比较短,执行的效率比较高。

汇编阶段:
指把汇编语言代码翻译成目标机器指令的过程。通常一个目标文件中至少有两个段:代码段和数据段。
代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。
数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。

链接阶段:
将有关的目标文件彼此相连接,也就是将一个文件中引用的符号与该符号在另外一个文件中的定义连接起来,使其变为一个统一的整体。链接方式主要分为两种:

(1)静态链接:函数的代码将符号所在的静态链接库拷贝到最终的可执行文件中,程序在执行的时候就会被装入该进程的虚拟地址空间中。静态链接库实际上就是一个目标文件的集合,其中的每个文件含有库中的一个或一组相关函数的代码。

(2)动态链接:函数的代码被放在叫做动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。

参考文献:http://blog.51cto.com/7905648/1297255

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值