您似乎对术语很感兴趣。术语“动态链接”对于实际发生的事情是用词不当。
链接器一般处理三种类型的文件:
- 目标文件
- 对象库
- 共享库
对象库只是一个文件,其中包含可以从中提取的其他对象文件,因此我将忽略该替代方案。
一个目标文件包含一个由文件定义的全局符号表和一个由文件引用的全局符号表。链接器将文件中的引用“链接”到另一个文件中的定义。它将链接文件的代码和数据内容添加到可执行文件(或共享库)中。
共享库包含一个定义的通用符号表和该库引用的通用符号。链接器将目标文件中的全局符号引用“链接”到共享库文件。链接完成后,可执行文件(或共享库)知道哪个共享库文件包含该符号,但不知道该符号在哪里。
有时,链接此类共享库的过程称为“动态链接”。
可执行文件有一个全局符号引用表,已映射到通用符号共享库。
当您运行可执行文件时,程序加载器会检查引用的共享库的可执行文件。然后它将(1)加载共享库; (2) 阅读图书馆的通用符号表,查找引用符号的地址; (3) 修复可执行文件中对这些符号的引用。
因为共享库可以引用其他共享库,所以这是一个递归过程。
有时,在运行时加载引用共享库的程序的过程称为“动态链接”。 (现在我们对同一个术语有两个定义。)
许多操作系统都提供相同的系统服务,用于加载共享库并在共享库中查找通用符号的地址,以供应用程序使用。在运行时(加载应用程序之后),应用程序可以通过 (1) 加载共享库和 (2) 定位所需符号来动态访问函数或其他通用符号。
这就是你所说的“动态加载”。