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

C++ 在动态链接中,更新库时.exe如何知道在何处搜索库?,c++,c,dynamic,linker,libraries,C++,C,Dynamic,Linker,Libraries,我的理解是,当C程序使用动态链接时,程序的编译版本(.exe)将库的内存地址存储在某个地方。当程序安装在其他人的计算机上时,库的位置是否不同?或者,当您更新库时,它的内存地址是否会有所不同?< P> C和C++都不指定它是如何工作的。对于不同的操作系统和exe格式,它是不同的。要了解具体情况,您需要了解您的实现是如何工作的 对您的问题的简短回答是,操作系统设置了程序运行的环境。它必须将程序附加到正确的位置,或者至少通知它。通常,启动程序后,格式会告诉操作系统应该加载哪些库,然后它会以某种方式链接

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

< P> C和C++都不指定它是如何工作的。对于不同的操作系统和exe格式,它是不同的。要了解具体情况,您需要了解您的实现是如何工作的

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


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

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

在program.exe启动之前,OS loader查找所需的DLL,将其加载到启动程序的虚拟内存空间,从该DLL中查找所需函数的当前地址,并将其写入导入的地址表(IAT)


当您的程序调用某些动态链接的函数时,它实际上会间接调用IAT中的地址。

哪个操作系统?这是WinX还是POSIX(ELF)?这些机制与MS windows的.exe提示不同-在这些C:\windows\System32、当前工作目录和.exe文件所在的目录以及其他一些目录中,查找目录的顺序是特定的。我再也不知道是什么命令了,离开窗户太久了。。。但是,如果库(dll)位于这些目录中的任何一个,程序将找到它。将库的内存地址存储在某个位置。当程序安装在其他人的计算机上时,库的位置是否不同?请记住,每个进程都有自己的虚拟地址空间。虽然你在这里谈论的是两个不同的概念。动态库的物理位置和库在内存中加载的地址。另一件需要考虑的是,现代操作系统随机化了加载进程的地址。