据我所知,当C程序使用动态链接时,程序的编译版本(.exe)会在某处存储库的内存地址。当程序安装在别人的计算机上时,库的位置不同吗?或者,当您更新库时,它的内存地址不会不同吗?
答案 0 :(得分:1)
C和C ++都没有规定这是如何工作的。它与不同的操作系统和exe格式不同。要了解您需要了解实施的具体方法。
对您的问题的简短回答是操作系统设置了程序运行的环境。它必须将程序附加到正确的位置,或至少通知它。通常,您启动程序,格式告诉操作系统应该加载哪些库,然后以某种方式链接地址。
通常还有一种方法可以手动执行此操作,并直接请求在运行时加载库。在这些情况下,可能不会发生呼叫的自动链接。
答案 1 :(得分:0)
是的,不同计算机上的库位置不同。是的,当您更新库时,其内存地址是不同的。这就是为什么动态链接函数的地址不能在可执行文件中硬连线的原因。相反,只有它的名称和托管库的名称(没有路径规范)以PE格式存储。
在program.exe启动之前,OS加载程序查找所需的DLL,将其加载到启动程序的虚拟内存空间,从此DLL中查找所需函数的当前地址,并将它们写入导入地址表(IAT)。
当你的程序调用一些动态链接的函数时,它实际上在IAT中对其地址进行间接调用。