内容简介 《链接器和加载器》描述了构建程序的关键工具——链接器和加载器。 内容包括链接和加载、体系结构、目标文件、存储分配、符号管理、库、重定位、加载和覆盖、共享库、动态链接和加载、动态链接共享库以及针对成熟的现代链接器所做的一些更改; 并介绍了一个正在进行的实践项目,该项目使用 Perl 语言开发一个可用的小链接器。 《链接器与加载器》适合作为高等院校计算机专业学生、实习程序员、语言设计者和开发者的阅读参考。 编者推荐《链接器和加载器》:无论你的编程语言是什么,无论你的平台是什么,你很可能总会涉及到链接器和加载器的功能。 但你知道如何充分利用它们吗? 直到现在,随着《链接器与加载器》的出版,终于有了一本深入、完整地彻底揭示编译时和运行时过程的权威书籍。 《链接器与加载器》首先通过例子解释了不同编译器和操作系统中链接和加载过程的差异。 在此基础上,作者提供了清晰实用的建议,帮助您创建更快、更清晰的代码。 您将学习如何避免 DLL 相关的陷阱、利用 UNIX ELF 库模式等等。 如果您认真对待编程,这本书将使您对该领域最困难的主题之一有深入的了解。 链接器和加载器也是编译器和操作系统课程的理想补充。
“ and ”功能 ◆ 涵盖UNIX、Linux、BeOS等操作系统的动态链接过程。 ◆解释Java 链接模式以及如何在网络小程序和可扩展Java 代码中使用它。 ◆帮助您编写更优雅、更高效的代码,构建可更高效地编译、定制和运行的应用程序。 ◆包含使用Perl 构建链接器的练习项目。 项目文件可以从互联网上下载。 媒体推荐 “我很喜欢阅读这本书,它有效地概述了实现链接器和加载器的许多技术和挑战。尽管书中的大多数示例都集中在当今广泛使用的三种计算机体系结构上,但这本书还包含许多笔记描述了过去一些有趣而怪异的计算机架构。通过这些现实生活中的战斗例子,我得出结论,作者本人确实经历过这些事情,并幸存下来告诉我们这个故事。 - Guy 作者 作者简介:(美国)Levin (John R.) 译者:李勇 Levin (John R.),是多本书的作者或合著者,包括 Lex & Yacc (O'), for Files C 和 C++ (Wiley) 以及 7-(IDG)。
他还是 C 语言的名誉出版商、新闻组的长期主持人以及最早的商业 77 编译器之一的创建者。 他在耶鲁大学获得计算机科学博士学位。 目录 第 1 章链接和加载 1.1 链接器和加载器的作用是什么? 1.2 地址绑定:从历史的角度来看 1.3 链接和加载 1.4 编译器驱动程序 1.5 链接:一个实例练习 第 2 章 体系结构问题 2.1 应用程序二进制接口 2.2 内存地址 2.3 地址结构 2.4 指令格式 2.5 过程调用和寻址功能 2.6 数据和指令引用2.7 分页和虚拟内存 2.8 Intel 386 分段 2.9 嵌入式架构练习 第 3 章目标文件 3.1 目标文件中有什么? 3.2 空目标文件格式:MS-DOS 的 COM 文件 3.3 代码段:UNIX 的 a.out 文件 3.4 重定位:MS-DOS 的 EXE 文件 3.5 符号和重定位 3.6 可重定位的 a.out 格式 3.7 UNIX ELF 格式 3.8 IBM 360 目标格式3.9 可移植可执行格式 3.10 Intel/OMF 文件格式 3.11 不同目标格式的比较练习项目 第四章 存储空间分配 4.1 段和地址 4.2 简单存储布局 4.3 多段类型 4.4 段和页的对齐 4.5 公共块和其他特殊段4.6 链接器控制脚本 4.7 实用存储分配练习项目 第 5 章 符号管理 5.1 绑定和名称解析 5.2 符号表格式 5.3 名称修改 5.4 弱外部符号和其他类型的符号 5.5 维护调试信息练习项目 第 6 章 库 6.1 库的用途 6.2 库格式 6.3 创建库文件 6.4 搜索库文件 6.5 性能问题 6.6 弱外部符号练习项目 第 7 章 重定位 7.1 硬件和软件重定位 7.2 链接时和加载时重定位 7.3 符号和段重定位 7.4 基本重定位技术 7.5 可重链接和可重定位输出格式 7.6 其他重定位格式 7.7 特殊情况重定位练习项目 第 8 章 加载和覆盖 8.1 基本加载 8.2 带重定位的基本加载 8.3 位置无关代码 8.4 引导加载 8.5 树形结构覆盖练习项目 第 9 章 共享库 9.1 绑定时间 9.2 实际共享库9.3 地址空间管理 9.4 共享库的结构 9.5 创建共享库 9.6 与共享库链接 9.7 使用共享库运行 9.8 黑客和其他共享库问题 实践项目 第 10 章 动态链接和加载 10.1 ELF 动态链接 10.2 ELF 文件内容 10.3 加载动态链接器 10.4 使用 PLT 的惰性过程链接 10.5 动态链接的其他特性 10.6 运行时动态链接 10.7 微软动态链接库 10.8 OSF/1 伪静态共享库 10.9 使共享库更快 10.10 几种动态链接方法的比较练习项目 第十一章 先进技术11.1 C++ 技术 11.2 增量链接和重新链接 11.3 链接时垃圾收集 11.4 链接时优化 11.5 链接时代码生成 11.6 Java 链接模型练习项目 参考文献 前言 几乎自计算机出现以来,链接器和加载器就一直是软件开发工具包的一部分。大约。 部分原因是它们允许使用模块(而不是单个大文件)构建程序的关键工具。
早在 1947 年,程序员就开始使用原始加载器:将程序的例程存储在几个不同的磁带上,然后将它们合并并重新定位到单个程序中。 在 20 世纪 60 年代初期,这些装载机已经得到了很好的发展。 由于当时内存昂贵且容量有限,计算机速度很慢(按照今天的标准),并且为了创建复杂的内存覆盖策略(将大程序加载到小内存中),并重新编辑以前链接的文件(以节省重新创建程序的时间),这些链接器包含许多复杂的功能。 在 20 世纪 70 年代和 80 年代,链路技术几乎没有进步。 链接器往往更简单,虚拟内存技术将大部分存储管理从应用程序和覆盖机制转移到操作系统,更快的计算机和更大的磁盘使重新链接程序或替换单个模块比仅链接已更改的内容更容易。 从 20 世纪 90 年代开始,链接器开始再次变得更加复杂,添加了许多现代功能,包括对动态链接共享库的支持以及对 C++ 独特要求的支持。 同时,像IA64这样的先进处理器架构,具有宽指令字和编译时内存访问调度特性,也需要在链接器中添加一些新的特性,以确保在链接时能够满足代码的这些复杂要求。程序。 。