在动态链接中,.exe如何知道在更新库时在哪里搜索库?

In dynamic linking, how does the .exe know where to search for the library when it is updated?

本文关键字:在哪里 搜索 更新 链接 动态 exe 何知道      更新时间:2023-10-16

我的理解是,当C程序使用动态链接时,程序的编译版本(.exe(将库的内存地址存储在某个地方。当程序安装在别人的计算机上时,库的位置不是不同吗?或者,当您更新库时,它的内存地址不会有所不同吗?

C 和 C++ 都没有指定它是如何工作的。 对于不同的操作系统和 exe 格式,这是不同的。 要了解细节,您需要研究您的实现是如何做事的。

对您的问题的简短回答是操作系统设置程序运行的环境。 它必须将程序附加到正确的位置,或者至少通知它。 通常,您启动程序,格式告诉操作系统它应该加载哪些库,然后以某种方式链接地址。

通常也有一种方法可以手动执行此操作,并直接请求在运行时加载库。 在这些情况下,可能不会发生呼叫的自动链接。

是的,库的位置在不同的计算机上是不同的。是的,当您更新库时,它的内存地址是不同的。这就是为什么动态链接函数的地址不能在可执行文件中硬连线的原因。相反,只有其名称和托管库的名称(没有路径规范(以 PE 格式存储。

在程序启动之前.exe,操作系统加载程序查找所需的DLL,将其加载到启动程序的虚拟内存空间,从此DLL中查找所需函数的当前地址,并将其写入导入的地址表(IAT(。

当你的程序调用某个动态链接的函数时,它实际上在 IAT 中对其地址进行间接调用。