了解动态链接(一)—— 概述

ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287

一、静态链接的缺点

1、浪费内存和磁盘空间

假设模块 A 和 B 都依赖于 C,采用静态链接的方式,C 库被链接到 A 和 B,这样无论是存储在磁盘还是在内存运行时,模块 C 都有2个副本。

2、程序维护麻烦

假设程序依赖很多库,其中任意一个修改了 bug 或进行了更新,都需要重新链接,重新发布。

二、动态链接 (Dynamic Linking)

把链接过程推迟到运行时再进行。

假设模块 A 和 B 都依赖于 C,采用动态链接的方式,在运行时,模块 C 在内存中只有一份,由 A 和 B 共享,在磁盘中也只有一份独立的 C 共享库即可。

采用动态链接,解决了上面提到的静态链接的两个缺点。

动态链接的过程大致是先递归的将依赖库加载到内存,然后进行符号解析和地址重定位,最后执行入口点程序。

三、动态链接不代表十全十美

1、共享库的版本控制问题

动态链接的基本思想是将程序拆分为各个相对独立的模块。一个常见的问题是,当程序所依赖的某个模块更新后,由于新旧模块的接口不兼容,导致原有的一些程序无法运行。

2、性能损耗

采用动态链接,程序每次运行时都要重新进行链接,这样会导致一些性能损耗。使用延迟绑定 (Lazy Binding) 可以尽量减小这种性能损耗。

四、如何快速了解动态链接的整个过程

最快的学习方式是看代码,比如通读 Android 系统的 Linker 代码。整个 Linker 的代码量不是很大,但前提要对 ELF 格式有一定的理解。

学习资料: 《程序员的自我修养——链接、装载和库》

原文地址:https://www.cnblogs.com/ilocker/p/4590873.html