zoukankan      html  css  js  c++  java
  • 了解动态链接(一)—— 概述

    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 格式有一定的理解。

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

  • 相关阅读:
    html 上传图片前预览
    php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
    php 计算 pdf文件页数
    php 获取半年内每个月的订单数量, 总价, 月份
    php 获取两个数组之间不同的值
    小程序支付功能
    关于nginx的Job for nginx.service failed because the control process exited with error code.错误
    linux 安装 Apollo
    MongoDB待续。。。
    ABP vNext...待续
  • 原文地址:https://www.cnblogs.com/ilocker/p/4590873.html
Copyright © 2011-2022 走看看