链接器和加载器

John R.Levine

出版时间

2009-08-31

ISBN

9787811245714

评分

★★★★★

标签

编程

书籍介绍

《链接器和加载器》讲述构建程序的关键工具——链接器和加载器,内容包括链接和加载、体系结构、目标文件、存储分配、符号管理、库、重定位、加载和覆盖、共享库、动态链接和加载、动态链接的共享库,以及着眼于成熟的现代链接器所做的一些变化;并介绍一个持续的实践项目,即使用Perl语言开发一个可用的小链接器。

《链接器和加载器》适合高校计算机相关专业的学生、实习程序员、语言设计者和开发人员阅读参考。

AI导读
核心看点
  • 本书深入剖析链接器与加载器的底层原理,涵盖ABI规范、内存地址管理、目标文件格式(如ELF、PE、COFF)及存储分配策略。通过对比不同操作系统和硬件架构下的实现差异,揭示程序从源代码到可执行文件的完整构建过程,帮助读者理解现代系统软件的核心机制。
  • 书中包含一个贯穿始终的实践项目,指导读者使用Perl语言从零开发一个功能可用的链接器。这种理论与实践结合的方式,让读者在动手实现符号解析、重定位、库管理等关键功能的过程中,深刻体会链接器设计的复杂性与工程挑战,提升底层编程能力。
  • 内容涉及大量历史技术演进,包括早期DOS、UNIX系统调用约定及废弃的目标格式。虽然部分技术已过时,但通过追溯链接器设计的历史脉络,读者能理解为何现代链接器采用当前架构,从而掌握ABI约束、安全机制及动态链接背后的设计哲学与合规要求。
适合谁读
  • 适合计算机科学与技术、软件工程等专业的在校学生,特别是正在学习编译原理、操作系统或系统编程课程的学生。本书可作为教材补充,帮助理解程序链接、加载及二进制文件结构的理论背景,为后续深入钻研系统底层技术打下坚实基础。
  • 适合从事编译器开发、系统工具链构建、嵌入式系统开发或安全研究的专业技术人员。对于需要深入理解二进制文件格式、动态链接机制、内存布局及ABI规范的开发者,本书提供了必要的理论支持和历史视角,有助于解决复杂的底层兼容性问题。
  • 适合对计算机系统底层原理有浓厚兴趣的资深程序员和技术爱好者。尽管书中部分技术已过时,但其对链接器设计思想、符号管理、库机制及安全约束的阐述,能帮助读者建立完整的系统级知识体系,提升对程序运行机制的整体认知深度。
读前提醒
  • 本书中译本翻译质量普遍受到读者诟病,术语表达生硬且存在错误,严重影响阅读体验。强烈建议读者直接阅读英文原版(Linkers and Loaders),或配合《程序员的自我修养》等中文优质书籍对照学习,以确保准确理解ABI、重定位等关键概念。
  • 书中涉及大量已淘汰的技术标准(如MS-DOS COM/EXE、早期UNIX格式),阅读时请保持批判性思维,重点关注其背后的设计原理而非具体实现细节。对于现代Linux/Windows开发,应结合当前主流文档学习ELF/PE格式,避免被过时信息误导。
  • 本书理论性强且缺乏现代实践案例,部分章节内容晦涩难懂。建议读者先具备C语言编程基础及汇编语言知识,并熟悉基本操作系统概念。若遇到理解障碍,可跳过历史章节,直接参考现代链接器文档或在线资源,切勿因翻译问题放弃学习核心原理。
读者共识
  • 读者普遍认为本书翻译质量极差,严重阻碍理解,不建议购买中译本。多数评论指出其内容陈旧,涉及大量过时技术,对现代开发指导意义有限。相比之下,《程序员的自我修养》因聚焦现代平台且通俗易懂,被广泛推荐为更优的替代读物,适合中文读者学习链接加载知识。
  • 尽管存在争议,部分读者仍认可其作为经典教材的理论价值,认为其系统性地阐述了链接器设计原理。有读者表示,通过阅读英文版或结合其他资料,能从中获得对操作系统底层机制的深刻理解。但共识是,本书不适合作为入门首选,仅适合有深厚基础且能阅读英文原版的读者。
  • 读者反馈书中实践项目使用Perl语言开发链接器,虽具教学意义,但与现代主流技术栈脱节。许多读者表示阅读过程痛苦,内容晦涩且插图简陋。综合来看,本书在技术更新迅速的今天已失去实用价值,仅具历史研究意义,不建议普通开发者投入大量时间研读。

本导读基于书籍简介、目录、原文摘录、短评和书评生成,不等同于全文精读。

精彩摘录
  • "每个操作系统都会为运行在该系统下的应用程序提供应用程序二进制接口(Applicatio n Binary Interface)。 ABI包含了应用程序在这个系统下运行时必须遵守的编程约定。ABI总是包含一系列的系统调用和使用这些系统调用的方法,以及关于程序可以使用的内存地址和使用机器寄存器的规定。 从一个应用程序的角度看,ABI既是系统架构的一部分也是硬件体系结构的重点,因此只要违反二者之一的条件约束就会导致程序出现严重错误。在很多情况下,链接器为了遵守ABI的约定需要进行一些重要的工作。 例如,ABI要求每个应用程序包含一个该程序中各例程使用的所有静态数据的地址表,链接器通常会通过收集所有链"
  • "每种ABI都通过将硬件定义的调用指令与内存、寄存器的使用约定组合起来定义了一个 标准的过程调用序列。硬件的调用指令保存了返回地址(调用执行后的指令地址)并跳转到目标过程。在诸如x86这样具有硬件栈的体系结构中返回地址被压入栈中,而在其它体系结构中它会被保存在一个寄存器里,如果必要软件要负责将寄存器中的值保存在内存中。具有栈的体系结构通常都会有一个硬件的返回指令将返回地址推出栈并跳转到该地址,而其它体系结构则使用一个“跳转到寄存器中地址”的指令来返回。 在一个过程的内部,数据寻址可分为4类:  调用者可以向过程传递参数。  本地变量在过程中分配,并在过程返回前释放。  本地静态数据保存在内"
  • "传统的a.out格式为UNIX社区服务了超过10年,但是在UNIX系统5(System V)推出 时,AT&T认为需要一些更好的东西来支持交叉编译、动态链接以及其它的现代系统特性。早期的系统5采用COFF格式,即通用目标文件格式(Common Object File Format),它最初是为交叉编译的嵌入式系统设计的,由于其无扩展版本不支持C++和动态链接,因此并不能在所有的分时系统上都很好的工作。在系统5的后期版本中,COFF被ELF格式替代,即可执行和链接格式(Executable and Linking Format)。ELF同样被流行的自由软件Linux和BSD等类UNIX系统所采用"
作者简介
莱文(John R.Levine),是很多书籍的作者或合作者,包括Lex & Yacc(O'Reilly),Programming for Graphics Files in C and C++(Wiley),以及7-heIntemetforDummies(IDG)。他还是Journal of C Language Translation的荣誉退休发行人、comp.compilers新闻组的长期仲裁人员,以及某个最早的商用Fortran 77编译器的创建考。他在耶鲁大学获得了计算机科学的博士学位。
目录
第1章 链接和加载
1.1 链接器和加载器做什么?
1.2 地址绑定:从历史的角度
1.3 链接与加载
1.4 编译器驱动

显示全部
用户评论
基本看不懂。
是一些概念上的描述,比较适合“需要懂,但又不需要深入懂”的程序员
估计还得多读几遍才能看懂
读的中译本,感谢译者但是读起来确实挺勉强。读了一半。
大部分不明白
翻译较差
linker&loader(中译本)
概念理论讲的很好,实践方面还需要自己去摸索…嗐
译者挺傻逼的。我是译者。
补充些早应该知道的知识
收藏