【发布时间】:2010-10-07 19:47:53
【问题描述】:
加载时动态链接和运行时动态链接有什么区别?
【问题讨论】:
标签: dll
加载时动态链接和运行时动态链接有什么区别?
【问题讨论】:
标签: dll
加载时动态链接
当一个可执行文件在构建时链接到一个 DLL 时,链接器不会插入目标代码,而是插入一个 stub,它基本上说这个名称的 function 是位于这个DLL中。
现在,当可执行文件运行时,可执行文件的一些位将丢失(即函数存根),因此在允许程序运行之前,程序加载器通过将这些丢失的函数替换为DLL 文件的入口点。
只有在所有存根都被替换(即解析)后,可执行文件才能被允许运行。
即加载时动态链接。
运行时动态链接
在这种情况下,可执行文件没有链接到任何 DLL 库文件,因此它不会在 dll 中包含任何存根,因此程序加载器在运行可执行文件时没有问题。
但是,从 DLL 中访问函数的任务留给了可执行文件,并且可以使用 GetProcAddress Windows API 来完成。
即运行时动态链接。
【讨论】:
您忘记了“作业”标签。
加载时链接意味着您要链接的 DLL 在您的应用程序启动时加载,无论您是否实际使用该 DLL 中的功能。动态链接意味着 DLL 的功能仅在实际需要时才加载。
【讨论】:
加载时动态链接由操作系统在加载应用程序时执行。 OS 使用链接器在文件中放置的信息来定位 dll 的名称,然后搜索那些 dll,如果找不到 Dll,它就简单地终止并给出错误消息,否则,OS 将 DLL 映射到进程的虚拟地址空间并增加 DLL 引用计数。
【讨论】: