ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287程序员
一、浪费内存和磁盘空间安全
假设模块 A 和 B 都依赖于 C,采用静态连接的方式,C 库被连接到 A 和 B,这样不管是存储在磁盘仍是在内存运行时,模块 C 都有2个副本。性能
二、程序维护麻烦学习
假设程序依赖不少库,其中任意一个修改了 bug 或进行了更新,都须要从新连接,从新发布。spa
把连接过程推迟到运行时再进行。版本控制
假设模块 A 和 B 都依赖于 C,采用动态连接的方式,在运行时,模块 C 在内存中只有一份,由 A 和 B 共享,在磁盘中也只有一份独立的 C 共享库便可。递归
采用动态连接,解决了上面提到的静态连接的两个缺点。接口
动态连接的过程大体是先递归的将依赖库加载到内存,而后进行符号解析和地址重定位,最后执行入口点程序。内存
一、共享库的版本控制问题学习资料
动态连接的基本思想是将程序拆分为各个相对独立的模块。一个常见的问题是,当程序所依赖的某个模块更新后,因为新旧模块的接口不兼容,致使原有的一些程序没法运行。
二、性能损耗
采用动态连接,程序每次运行时都要从新进行连接,这样会致使一些性能损耗。使用延迟绑定 (Lazy Binding) 能够尽可能减少这种性能损耗。
最快的学习方式是看代码,好比通读 Android 系统的 Linker 代码。整个 Linker 的代码量不是很大,但前提要对 ELF 格式有必定的理解。
学习资料: 《程序员的自我修养——连接、装载和库》