Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4066462
  • 博文数量: 251
  • 博客积分: 11197
  • 博客等级: 上将
  • 技术积分: 6862
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-05 14:41
个人简介

@HUST张友东 work@taobao zyd_com@126.com

文章分类

全部博文(251)

文章存档

2014年(10)

2013年(20)

2012年(22)

2011年(74)

2010年(98)

2009年(27)

分类:

2010-07-07 18:47:57

 

    程序设计的模块化是程序员们一直在追求的目标,因为当一个系统十分复杂时,我们不得不将一个复杂的系统逐步分割成小的系统以达到各个击破的目的。复杂的软件也是如此,程序员把每个源代码模块独立的编译,然后按照需要将它们组装起来,这个组装模块的过程就是链接。链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地链接,链接过程主要包括地址和空间分配,符号决议和重定位等步骤。链接过程如下图所示:

 

 

     如程序模块main.c中使用了另外一个模块中的func.c中的函数foo(),在main.c中的每一次调用foo函数时都必须知道foo的确切地址,但由于每个模块都是单独编译的,在编译main的时候并不知道foo函数的地址,故暂时这些调用foo的指令的目标地址搁置(通常用0代替,外部模块变量的引用类似),等待最后链接的时候由链接器去将这些指令的目标地址修正,链接器在func.c模块中查找foo的地址,并将main.c模块中所有引用到foo的指令进行修正,这也是静态链接最基本的过程和作用。如果没有链接器,则必须手工的把每个调用foo的指令进行修正,填入正确foo的地址,当func.c被重新编译,foo的地址可能改变,则又必须重新再main中修正所有foo的地址,这对于程序员无疑是沉重的负担,看来以前的程序员日子并不好过啊。

 

阅读(2126) | 评论(0) | 转发(3) |
0

上一篇:GCC编译过程分解

下一篇:ELF文件结构

给主人留下些什么吧!~~