编译链接原理

                   从源代码到可执行程序,需要经历以下几个过程:预处理、编译、汇编、连接。

1.预处理

预处理主要是处理以"#"开头的预编译指令,包括#include、#define、#if等;删除注释、添加行号以及头文件展开。

2.编译

编译的主要工作是词法分析、语法分析、优化编译,将源代码翻译成汇编代码。

3.汇编

汇编是将汇编代码翻译成可重定位目标文件。

4.链接

   链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件是可以被加载到内存中执行的。链接可以执行于编译时,也就是在源代码生成机器码的时候;也可以执行于加载时,也就是在程序被加载器(loader)加载到存储器并执行时;还可以执行于运行时,由应用程序来执行。也就是说,加载可以在三种情况下完成,一是在编译时由静态编译器来完成(静态链接);二是在加载时完成;三是在运行时由动态链接器来完成(动态链接)。

  将外部函数的代码(通常后缀名为.lib和.a文件)添加到可执行文件的过程,称之为静态链接。在程序运行时,将外部函数的代码加载进来的过程,称之为动态链接。静态链接的好处是适用范围广,不用担心缺少某个库文件,缺点是可执行文件比较大,不能共享库。动态链接的好处是可执行文件可以比较小,多个应用程序可以共享库文件,不足之处是需要事先安装好的库文件。

    我们假设可执行文件由main.c和swap.c两个源文件生成,编译链接的过程如下图所示:


     其中图中演示的是静态链接的过程,静态链接是一组可重定位目标文件和命令行参数作为输入,生成一个完全可执行的文件。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值