一 链接和加载

1.1 链接器和加载器做什么?

链接器和加载器的基本工作都非常简单,将抽象的名称与底层的名称绑定起来,以支持程序员使用抽象的名称编写代码,举例来说,程序员编写代码时可以使用一个诸如getline的名称,而这个名称会被加载器和链接器定到一个底层的地址,例如iosys模块中可执行代码的滴612字节处,甚至这个地址还可以更加抽象。

1.2 从历史发展的角度分析地址绑定

为了深入理解链接器和加载器做了什么,我们可以看看他们在计算机编程系统的发展中承担了什么角色。

最早的计算机完全是用机器语言进行编码的,程序员需要在纸上用符号写出程序,然后手动的将其汇编为机器码,再通过开关,纸带或者卡片将其输入计算机中,据说真正的高手可以直接使用开关来编码。如果程序员使用符号来表示地址,那他就的在汇编机器码的过程中手动完成符号到地址的绑定。如果后来发现需要添加或者删除一条指令,那么这些绑定的地址就可能发生改变,此时整个程序必须手动调整一遍,饼确保修正了每一个受到影响的地址。

问题就在于名字和地址绑定过早了,汇编器可以解决一部分问题,它支持程序员使用符号化的名称编写程序,然后又汇编器程序将名称绑定到机器地址。如果程序被改变了,那么程序员必须重新进行汇编,但是这并不会有太大的麻烦,因为地址分配的工作已经从程序员推给了计算机。

代码库的使用使得地址分配的工作更加复杂,计算机可以支持的基本操作及其简单,实际使用的程序都是由子程序组成的,这些子程序能够实现更复杂的,更高级的操作,计算机在安装的时候都会安装一些预先编写好,调试好的子程序库,程序员可以在自己写的新程序中直接使用它们,而不需要再次编写这些子程序的代码,然后程序员可以将这些子程序加载到主程序中,从而组成一个完成的,可以工作的程序。

在汇编器出现之前,程序员就已经在使用子程序库了,早在1947年,john Mauchly 就在文章中描述了库的使用过程,在主程序加载的同时,再从磁带中加载一系列特定的子程序,并对加载的子程序代码进行重新定位处理以使其匹配实际被加载的地址,我们惊奇的发现链接器的两个基本功能,--重新定位和库查询,--可能在汇编出现之前就已经出现了,假设主程序和子程序都是由机器语言编写的,可重定位的加载器允许子程序的开发者和使用者编写代码的时候都认为程序是从地址0开始的。而实际的地址绑定工作会推后到链接的过程,这些子程序被链接到某个特定的主程序时,才会为它们分配地址。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值