动态链接和动态加载的区别

Difference between dynamic linking and dynamic loading

引用维基百科关于动态加载

Dynamic loading is a mechanism by which a computer program can, at run time, load a library into memory, Unlike static linking and dynamic linking, dynamic loading allows a computer program to start up in the absence of these libraries.

所以,如果我错了请纠正我,但是在 动态加载 中,库是通过 显式 加载的 加载库函数.

而在动态链接中,加载和链接可执行文件所需的共享库被推迟到运行时间,OS 负责将库的内容从持久存储复制到RAM。

能否请您再简单地解释一下动态链接和动态加载之间的区别?我还是一头雾水。

在此先致谢!

您似乎对术语很感兴趣。 "dynamic linking" 一词对实际发生的情况用词不当。

链接器通常处理三种类型的文件:

  1. 目标文件
  2. 对象库
  3. 共享库

对象库只是一个文件,其中包含可以从中提取的其他对象文件,因此我将忽略该选项。

目标文件包含文件定义的 table 个全局符号和文件引用的 table 个全局符号。链接器 "links" 将文件中的引用引用到另一个文件中的定义。它将链接文件的代码和数据内容添加到 executable(或共享库)。

共享库包含 table 定义的通用符号和库引用的通用符号。目标文件中的链接器 "links" 全局符号引用到共享库文件。链接完成后,executable(或共享库)知道哪个共享库文件包含该符号,但不知道该符号在哪里。

有时,链接此类共享库的过程称为 "dynamic linking."

executable 有 table 个已映射到通用符号共享库的全局符号引用。

当您 运行 executable 时,程序加载程序会检查 executable 引用的共享库。然后它将(1)加载共享库; (2) 读取通用符号库的table,查找引用符号的地址; (3) 修复executable.

中对那些符号的引用

因为共享库可以引用其他共享库,所以这是一个递归过程。

有时在 运行 加载引用共享库的程序的过程称为 "dynamic linking."(现在我们对同一术语有两个定义。)

许多操作系统使用相同的系统服务来加载共享库,并在共享库中查找通用符号的地址供应用程序使用。在 运行 时间(应用程序加载后),应用程序可以通过 (1) 加载共享库和 (2) 定位所需符号来动态访问函数或其他通用符号。

这就是你所说的"dynamic loading."