动态链接:机制

动态链接:机制

2025 南京大学《操作系统原理》
动态链接:机制

“动态链接库”

熟悉的 .dll 文件

2025 南京大学《操作系统原理》
动态链接:机制

为什么需要动态链接?

struct exec {
    uint32_t  a_midmag;  // Machine ID & Magic
    uint32_t  a_text;    // Text segment size
    uint32_t  a_data;    // Data segment size
    uint32_t  a_bss;     // BSS segment size
    uint32_t  a_syms;    // Symbol table size
    uint32_t  a_entry;   // Entry point
    uint32_t  a_trsize;  // Text reloc table size
    uint32_t  a_drsize;  // Data reloc table size
};
  • d3dx9_xxx.dll 就这样为每个游戏复制了一份
    • 似乎不是个好想法?
    • 我们希望 “拆解” 应用程序
2025 南京大学《操作系统原理》
动态链接:机制

“拆解应用程序” 的需求 (1)

实现运行库和应用代码分离

  • 应用之间的库共享
    • 每个程序都需要 glibc
    • 但系统里只需要一个副本就可以了
      • 是的,我们可以用 ldd 命令查看
      • 运行库和应用代码还可以分别独立升级
  • 大型项目的分解
    • 改一行代码不用重新链接 2GB 的文件
    • libjvm.so, libart.so, ...
      • NEMU: “把 CPU 插上主板”
2025 南京大学《操作系统原理》
动态链接:机制

“拆解应用程序” 的需求 (2)

库的依赖也是一种代码克隆

如果 Linux 应用世界是静态链接的……

  • libc 紧急发布安全补丁 → 重新链接所有应用 😂
  • Semantic Versioning
    • “Compatible” 是个有些微妙的定义
    • “Dependency hell”
2025 南京大学《操作系统原理》