从源代码到可执行程序,需要经历以下几个过程:预处理、编译、汇编、连接。
1.预处理
预处理主要是处理以"#"开头的预编译指令,包括#include、#define、#if等;删除注释、添加行号以及头文件展开。
2.编译
编译的主要工作是词法分析、语法分析、优化编译,将源代码翻译成汇编代码。
3.汇编
汇编是将汇编代码翻译成可重定位目标文件。
4.链接
链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件是可以被加载到内存中执行的。链接可以执行于编译时,也就是在源代码生成机器码的时候;也可以执行于加载时,也就是在程序被加载器(loader)加载到存储器并执行时;还可以执行于运行时,由应用程序来执行。也就是说,加载可以在三种情况下完成,一是在编译时由静态编译器来完成(静态链接);二是在加载时完成;三是在运行时由动态链接器来完成(动态链接)。
将外部函数的代码(通常后缀名为.lib和.a文件)添加到可执行文件的过程,称之为静态链接。在程序运行时,将外部函数的代码加载进来的过程,称之为动态链接。静态链接的好处是适用范围广,不用担心缺少某个库文件,缺点是可执行文件比较大,不能共享库。动态链接的好处是可执行文件可以比较小,多个应用程序可以共享库文件,不足之处是需要事先安装好的库文件。
我们假设可执行文件由main.c和swap.c两个源文件生成,编译链接的过程如下图所示:
其中图中演示的是静态链接的过程,静态链接是一组可重定位目标文件和命令行参数作为输入,生成一个完全可执行的文件。
636

被折叠的 条评论
为什么被折叠?



