Linker and loader
介绍 几乎从有计算机以来,链接器和加载器就是软件开发工具包中的一部分,因为他们是 允许使用模块(而不是一个单独的大文件)来构建程序的关键工具。 早在1947年,程序员们就开始使用原始的加载器:将程序的例程存储在多个不同的磁 带上,并将他们合并、重定位为一个程序。在上世纪60年代早期,这些加载器就已经发展 的相当完善了。由于那时内存很贵且容量有限,计算机的速度(以今天的标准)很慢,为了 创建复杂的内存覆盖策略(将大容量的程序加在到少量的内存中),以及重复编辑之前链接 过的文件(节省重新创建程序的时间),这些链接器都包含了很多复杂的特性。 上世纪70到80年代,链接技术几乎没有什么进展。链接器趋向于更加简单,虚拟内存 技术将应用程序和覆盖机制中的大多数存储管理工作都转移给了操作系统,越来越快的计算 机和越来越大的磁盘也使得重新链接一个程序或替换个别模块比仅仅链接改变过的地方更加 容易了。从上世纪90年代起,由于增加了诸如动态链接共享库和C++的诸多现代特性,链接 器又开始变得复杂起来。像IA64这样具有长指令字和编译时访存调度等特性的先进处理器 架构,也需要将一些新的特性加入到链接器中以确保在被链接的程序中可以满足代码的这些 复杂需求。 本书的目标读者是 哪些人? 本书预计供下述几类读者使用。 学生:由于链接过程看起来似乎是微不足道和显而易见的,编译器构建和操作系统 课程通常对链接和加载都缺乏重视。这对于以前讨论Fortan,Pascal,C,和不使 用内存映射或共享库的操作系统而言可能是对的,但是现在就不那么正确了。 C++,Java和其它的面向对象语言需要更加完善的链接环境。使用内存映射的可执 行程序,共享库,和动态链接影响了一个操作系统的很多部分,一个忽略链接问题 的操作系统设计者将承担巨大的风险。 实习程序员也需要知道链接器都做了什么,尤其是对现代语言。C++在链接器中放 置了不少独特的特性,而大型C++程序容易发生难以诊断的bug也是由于在链接时 发生了不可预料的事情(最常见的情况是静态构造函数没有按照程序员预计的顺序 执行 )。 当正确使用时,诸如共享库和动态链接此类的链接器特性将(给程序员的工作)带来很大的灵活性和强大支持。 语言设计者和开发人员应该在构建语言和编译器时了解链接器会做什么和能做什么。 由于可以由链接器处理某些细节,那些手工进行了30多年的编程任务今天在C++中 可以自动处理了(想一想在C语言中为了获取和C++中的模板相同的功能,或为了 保证在程序主体执行之前使成百个C源文件中的初始化例程可以执行,程序员不得 不做的那堆事情)。有了功能更强大的链接器的支持,未来的语言将更加自动化而 不仅限于程序范畴内的常规任务。由于链接是编译过程中将整个程序的代码放在一 起处理并可对程序作为一个整体施加影响的唯一阶段,因此链接器还将被加入更多 的全局程序优化功能。 (编写链接器的人员当然都需要本书。但是全球所有的链接器设计者大概只能坐满一个 房间,而且其中有半数因为审阅手稿已经拥有本书了。 )
用户评论