【问题标题】:MinGW/GCC Delay Loaded DLL equivalent?MinGW/GCC 延迟加载 DLL 等效?
【发布时间】:2010-12-23 12:04:30
【问题描述】:

我正在尝试将一些旧的 MSVC C++ 代码移植到 MinGW/GCC。

一个问题是该项目在很大程度上依赖于 /DELAYLOAD 选项来处理并不总是使用的函数,以及运行时正确的 dll 所在的位置。

MinGW/GCC 上有类似的选项吗?

此代码针对 windows 平台。

【问题讨论】:

    标签: c++ visual-studio gcc mingw visual-c++


    【解决方案1】:

    我还要补充一点,虽然延迟加载 DLL 似乎是 Windows 操作系统的一部分,但它们实际上是根据链接器生成的小存根实现的。至少,以前是这样的。因此,在 Windows 操作系统级别没有正式的“延迟加载”概念。有一个约定,基于链接器发出的二进制代码。

    【讨论】:

    • 不是真正的 Windows 特定的,其他操作系统以相同的方式实现延迟加载。
    • 现在有,从 WIndows 10 开始。见QueryOptionalDelayLoadedAPI
    【解决方案2】:

    在 elf 目标(对于类 Unix 系统)上,您可以使用 ld(MinGW 也使用的链接器)指定 -z lazy 选项(无论如何都是默认选项)。

    据我所知,i386 PE 目标(适用于 Windows)没有有明确的惰性链接选项。我找不到任何可用的文档。

    【讨论】:

    • 那是最不幸的。我将不得不想出某种解决方法。感谢您的帮助!
    • 我认为这不是正确的答案。 -z lazy 启用延迟符号解析,但始终加载共享库。 /DELAYLOAD 启用延迟链接,即延迟库的加载,直到调用其中一个函数(Solaris 具有此功能,但由于某种原因它没有进入 Glibc,因为 Drepper^W^W)。
    • @yugr 是对的,gcc 只对符号进行延迟加载(无论如何这是默认设置),无论如何它都会在启动时加载库,根本不涵盖 MSVC /DELAYLOAD 的目的跨度>
    【解决方案3】:

    您可以使用dlltool--output-delaylib 参数来创建延迟加载的导入库。然后,您可以链接到生成的导入库以延迟加载 DLL。

    作为延迟加载现有 DLL 的示例,假设您要延迟加载 Windows DLL version.dll,它导出 GetFileVersionInfoSizeW。首先,我们在 version.def 文件中定义要调用的函数:

    EXPORTS
     GetFileVersionInfoSizeW
    

    然后我们可以使用dlltool 创建一个延迟加载的导入库:

    dlltool --input-def version.def --output-delaylib version.lib --dllname version.dll
    

    链接时,使用生成的version.lib:

    gcc -o test test.c -lversion -L .
    

    此示例的完整版本可在 my GitHub 上获得。

    有趣的事实:在提出此问题时,已发布的软件中可能没有此功能。在提出这个问题之前,该功能已提交 three months

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2021-05-06
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多