【问题标题】:Does DLL linking on windows results in GetProcAddress on runtime?Windows 上的 DLL 链接是否会在运行时导致 GetProcAddress?
【发布时间】:2016-02-18 16:31:59
【问题描述】:

我很好奇动态链接在 Windows 上的工作原理。由于我们不能直接链接到一个,Windows 通常将您的可执行文件链接到一个 LIB 文件,该文件包含由 DLL 导出的函数的存根。这种类型的链接是否会在运行时产生LoadLibraryGetProcAddress?如果没有,链接如何在内部工作?

【问题讨论】:

  • 您可以拥有多个版本的 DLL,这意味着它包含的函数可能位于不同的地址,所以是的,操作系统需要调用 LoadLibraryGetProcAddress。但是,它很可能使用这些功能的内部版本,而不是公开可见的。
  • 函数的地址是动态的吧?由于每次加载时 dll 的地址都会发生变化。 @CareyGregory
  • 间接,是的。它由操作系统加载器完成,它使用可执行文件中的导入表来知道DLL名称和需要查找的函数名称。使用 Dumpbin.exe /imports 查看该表的外观。

标签: c++ windows dll


【解决方案1】:

答案是也许

默认方法是创建一个导入表,其中列出了所有必需的 DLL 和从那里使用的函数。该表由操作系统直接解析。它可能会为此重用 LoadLibrary 背后的一些相同代码。它很可能使用来自GetProcAddress 的代码,但更愿意对所有必要的函数进行一次批量查找。

然而有一个称为延迟加载的 MSVC 功能。有了这个特性,MSVC++ 就不会建立这样一个导入表,而是插入实际的LoadLibraryGetProcAddress 调用。好处是这些呼叫是在可能的最晚时刻进行的。虽然您不需要特定的 DLL,但它不会被加载。这可以加速程序启动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2013-08-13
    相关资源
    最近更新 更多