第二章:编译和链接_3_4

第二章:编译和链接_3_4

2.3 链接器的年龄比编译器长

程序并不是一写好久永远不变的,它会经常被修改。比如我们在第一条指令之后,第五条指令之前插入了一条或多条指令,那么第五条指令后面的的指令的位置也会相应的往后移动,当程序修改的时候,这些位置都要重新计算,十分繁琐又耗时,并且容易出错。这种重新计算各个目标地址的过程叫做 重定位

于是 符号这个概念随着汇编语言的普及迅速的被使用,他可以用来表示一个地址,这个地址可能是一段程序的起始地址,也可以是一个变量的起始地址。

2.4 模块拼装——静态链接

程序设计模块化是人们一直在追求的目标,因为当一个系统十分复杂的时候,我们不得不将一个复杂的系统逐步分割成小的系统以达到各个突破的目的。

一个复杂的软件也是如此,人们把每个源代码模块独立的编译,然后按照须要将他们"组装"起来,这个组装模块的过程就是 链接。链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块能够正确地衔接。

链接的过程主要包括了 地址和空间分配,符号决议,和重定位等这些步骤。

最基本的静态链接就是将源代码经过编译器编译成 目标文件,目标文件和 **库(Library)**一起链接成为最终的可执行文件。而最常见的库就是 运行时库(Runtime Library),它是支持程序运行的基本函数的集合。库其实是一组目标文件的包,就是一些最常见的代码编译成目标文件后打包存放。

由于在编译目标文件的时候,编译器不知道另一个模块的变量的地址,所以编译器在没法确定地址的情况下,便将需要用到这个变量的地址置为0,等待链接器将该目标文件和那个目标文件链接起来后再进行修正。这个地址的修正过程也叫做 重定位,每个要被修正的地方叫做一个 重定位入口,重定位就是给程序中每个这样的绝对地址引用的位置 “打补丁”,使他们指向正确的地址。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值