深入理解计算机系统_第七章_链接

章前导读

链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载到内存并执行。链接可以执行于编译时,也就是在源代码被翻译成机器代码时;也可以执行于加载时,也就是程序被加载器加载到内存并执行时;甚至执行于运行时,也就是由应用程序来执行。现在系统中,链接是由叫做链接器的程序自动执行的。
链接器使得分离编译成为可能。这样我们可以独立修改和编译不同的模块,改变这些模块中的一个时,只需要简单地重新编译它,并重新链接应用,而不必重新编译其他文件。

编译器驱动程序

大多数编译系统提供编译器驱动程序,它代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。下图展示了驱动程序将程序从ASCII码源文件翻译成可执行目标文件时的行为。
在这里插入图片描述
在运行可执行文件prog时,shell调用操作系统中一个叫做加载器的函数,他将可执行文件prog中的代码和数据复制到内存,然后将控制转移到这个程序的开头。

静态链接

像Linux LD程序这样的静态链接器以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的、可以加载和运行的可执行目标作为输出。输入的可重定位目标文件由各种不同的代码和数据节组成,每一节都是一个连续的字节序列。指令在一节中,初始化了的全局变量在另一节中,而未初始化的变量又在另外一节中。
为了构造可执行文件,链接器完成如下两个主要任务:
1.符号解析。目标文件定义和引用符号,每个符号对应于一个函数、一个全局变量或一个静态变量(C语言中任何以static属性声明的变量)。符号解析的目的是将每一个符号引用正好和一个符号定义关联起来。
2.重定位。编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义与一个内存为止关联,从而重定位这些节,然后修改所有这些符号的引用,使得它们纸箱这个内存位置。链接器使用汇编器产生的重定位条目的详细指令,不加甄别地执行这样的重定位。
目标文件纯粹是字节块的集合。这些块中,有些包含程序代码,有些包含程序数据,而其他的则包含引导链接器和加载器的数据结构。链接器将这些块连接起来,确定被连接块的运行时位置,并且修改代码和数据块中的各种位置。

目标文件

目标文件有三种形式:
1.可重定位目标文件。包含二进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件。
2.可执行目标文件。包含二进制代码和数据,其形式可以被直接复制到内存并执行
3.共享目标文件。一种特殊类型的可重定位目标文件,可以在加载或运行时被动态地加载进内存并链接。
编译器和汇编器生成可重定位目标文件(包括共享目标文件)。链接器生成可执行目标文件。

可重定位目标文件

下图是一个典型的ELF可重定位目标文件的格式。不同节的位置和大小是由节头部表表述的,其中目标文件中每个节都有一个固定大小的条目。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《深入理解计算机系统》是一本经典的计算机科学教材,第二版是对第一版的全面升级和扩展。本书的作者是布莱恩·卡尼汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie),他们是C语言的创始人之一,有着丰富的实践经验和深厚的理论功底。 这本书的主要目的是帮助读者深入了解计算机系统的底层原理和工作机制,以及如何利用这些知识进行系统性能优化和问题调试。书中从编程语言、汇编语言、程序执行、内存管理、文件系统等多个角度,详细介绍了计算机系统的各个组成部分和其相互作用的方式。 第二版在内容和理念上都有了一些新的改进。首先,本书增加了关于网络编程和并发编程的新章节,以适应当今计算机系统日益复杂的发展趋势。其次,为了保持与迅速变化的技术形势的同步,第二版对许多章节进行了修订和更新,包括对新的计算机体系结构、处理技术、存储介质等的介绍,并针对一些近期出现的漏洞和攻击做了相应的解释。 本书的特点是理论与实践相结合,既深入剖析计算机系统的原理,又通过大量实例和案例帮助读者将理论应用到实际问题中。读者在阅读过程中,不仅可以学到计算机系统的原理和工作机制,还能够锻炼自己的系统设计和调试能力。 总的来说,《深入理解计算机系统》第二版是一本非常重要的计算机科学教材,适合对计算机系统工作原理感兴趣的学生、教师和从业人员阅读。通过阅读本书,读者可以深入理解计算机系统的底层原理,提高系统性能,解决实际问题。 ### 回答2: 《深入理解计算机系统》第二版是一本经典的计算机系统原理教材,由美国卡内基梅隆大学的教授布莱恩·卡尼汉(Brian Kernighan)和罗伯特·戴维森(Robert Davidson)合著。本书的中文翻译版本在CSDN上非常受欢迎。 该书主要通过深入讲解计算机底层硬件、操作系统以及编译原理等知识,帮助读者全面理解计算机系统的工作原理和设计思想。书中内容围绕计算机系统的核心概念展开,包括进程、内存管理、文件系统、虚拟内存等。 《深入理解计算机系统》第二版与第一版相比,进行了全面的更新和改进。作者引入了最新的计算机体系结构和技术,在保留经典内容的基础上,增加了对多核处理、并行计算等新技术的讲解。此外,书中后期的内容还涉及了网络编程、安全和性能优化等实际应用方面的知识。 这本书的优点在于,作者以清晰简洁的语言,结合大量实例和案例,将复杂的计算机系统理论概念讲解得容易理解和易于实际运用。读者通过学习本书,可以更好地理解和分析计算机系统的性能瓶颈,并通过优化和改进提升系统的效率。 此外,《深入理解计算机系统》还鼓励读者通过自主实践,使用常见的工具和技术,动手实践并深入理解计算机系统设计和性能调优的方法。这种实践性的学习方式,使得读者能够通过实际操作加深对书中知识的理解和掌握。 总之,《深入理解计算机系统》第二版通过全面深入的讲解,帮助读者建立起系统化的计算机系统知识框架。对于计算机科学相关专业的学生和从事软件开发、系统管理等工作的人员来说,本书都是一本非常有价值的参考资料,有助于他们理解计算机系统的内在原理和工作机制,进一步提升技术水平。 ### 回答3: 《深入理解计算机系统(第二版)》是由美国卡内基梅隆大学的教授Randal E. Bryant和David R. O'Hallaron合著的一本计算机系统相关的教材。该书是计算机科学与工程领域的经典教材之一,旨在帮助读者深入理解计算机系统的底层原理和工作机制。 这本书主要分为10个章节,从CPU的组成部分开始,逐步向上层的内存和I/O系统扩展。第一章介绍了计算机系统的基本概念和层次结构,为后续章节奠定了基础。接着,第二章到第五章讲解了整数和浮点数的表示与运算,同时介绍了汇编语言和数据表示的相关概念。 在第六章和第七章中,书籍聚焦于理解计算机系统中内存层次结构和缓存一致性。这些章节解释了为什么程序中有些内存操作会比其他操作更快,并介绍了各种优化技术。在第八章中,书籍介绍了虚拟内存的概念与实现方式,深入讲解了操作系统如何使用虚拟内存机制提高程序的执行效率。 接下来的两个章节,第九章和第十章,介绍了动态内存分配和链接。这些章节探讨了程序运行时如何管理内存和使用动态分配的技术,如何生成可执行文件并将其与其他对象文件链接。 《深入理解计算机系统(第二版)》通过系统性的讲解,帮助读者逐步深入理解计算机系统的底层原理。书中的例子和实践问题,能帮助读者巩固所学知识并应用于实际问题。此外,书的附录还提供了一些计算机系统方面的背景知识,供读者参考。 通过阅读这本书,读者可以全面掌握计算机系统的基本原理,并具备实际解决问题的能力。无论是对于计算机科学与工程专业的学生,还是对于从事计算机系统相关领域的从业者来说,《深入理解计算机系统(第二版)》都是一本必不可少的参考书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值