深入理解计算机系统:链接(第三章:动态链接、运行时加载共享库、库打桩)

本文介绍了动态链接库的概念,如何解决静态库的缺陷。动态链接由动态链接器执行,Linux中以.so文件表示,Windows中为.dll。文章讨论了运行时加载和链接共享库,提供了一些实际应用案例,如软件更新和高性能Web服务器的实现。位置无关代码(PIC)允许共享库在内存中的任意位置加载。最后,文章探讨了库打桩机制,一种用于拦截和替换共享库函数调用的技术,类似Windows的钩子函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、概述

前面整理了,静态连接库、可重定位目标文件、可执行文件等,还有动态库的部分没有整理。今天就把欠的账给补上。

静态库前面整理了很多,但是它有明显的缺点:其一是如果静态库更新,则使用它的用户也需要跟着更新;其二如果多个程序都使用这个静态库,那么需要把静态库的内容复制到程序中,造成了系统资源的浪费。为了解决这个问题,而产生了共享库。

2、共享库(动态连接库)

共享库是为了解决静态库缺陷的一个现代创新产物。共享库是一个目标模块,在运行或加载时,可以加载到任意的内存地址,并和一个在内存中的程序链接起来。这个过程叫做动态链接,是由一个叫做 动态链接器 的程序来执行的。在Linux系统中通常用.so后缀来表示,在Windows系统中,用.dll后缀来表示,叫做动态链接库。

共享库是以两种不同的方式来 “共享” 的。首先,在任何给定的文件系统中,对于一个库只有一个.so文件。所有引用该库的可执行目标文件共享这个.so文件中的代码和数据,而不是像静态库的内容那样被复制和嵌入到引用它们的可执行文件中。其次,在内存中,一个共享库的.text节的一个副本可以被不同的正在运行的进程共享。

使用动态库生成可执行文件的过程中,静态的执行一部分链接,然后在程序加载时,动态完成剩余部分的链接过程。没有任何的动态库代码和数据节真的被复制到可执行文件中,而是,复制了一些重定位和符号表信息,它们使得运行时可以解析对动态库中代码和数据的引用。

3、从应用程序中加载和链接共享库

应用程序还可以在它运行时要求动态链接器加载和链接某个共享库,而无需在编译时将那些库链接到应用中。

动态链接是一项强大有用的技术。下面是一些现实世界中的例子:
分发软件。微软Windows应用的开发者常常利用共享库来分发软件更新。它们生成一个共享库的新版本,然后用户可以下载,并用它替代当前的版本。下一次它们运行应用程序时,应用将自动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值