【问题标题】:In dynamic linking, how does the .exe know where to search for the library when it is updated?在动态链接中,.exe 如何知道更新时在哪里搜索库?
【发布时间】:2017-12-26 11:42:09
【问题描述】:

据我了解,当 C 程序使用动态链接时,程序的编译版本 (.exe) 会将库的内存地址存储在某处。程序安装在别人的电脑上,是不是库的位置不一样?或者,当你更新库时,它的内存地址不会不同吗?

【问题讨论】:

  • 哪个操作系统?
  • 这是 WinX 还是 POSIX (ELF)?机制不同
  • .exe 提示 MS 窗口 - 查找的目录有特定顺序 - 在这些 C:\Windows\System32、当前工作目录和 .exe 文件所在的目录中其他一些。不知道是哪个命令了,现在离开窗口太久了……但是,如果库(dll)位于这些目录中的任何一个目录中,程序就会找到它。
  • 将库的内存地址存储在某处。当程序安装在别人的计算机上时,库的位置不是不同吗?记住每个进程都有自己的虚拟地址空间。尽管您似乎在这里谈论的是两个不同的概念。动态库的物理位置和库在内存中加载的地址。
  • 要考虑的另一件事是现代操作系统随机分配用于加载进程的地址。 en.wikipedia.org/wiki/Address_space_layout_randomization

标签: c++ c dynamic linker libraries


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 2022-01-18
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多