MinGW/GCC 延迟加载 DLL 等效项?

问题描述 投票:0回答:3

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

一个问题是该项目严重依赖 /DELAYLOAD 选项来执行并不总是使用的函数,以及运行时正确的 dll 所在的位置。

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

此代码针对Windows平台。

c++ visual-studio gcc mingw visual-c++
3个回答
7
投票

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


4
投票

在 elf 目标上(对于类 Unix 系统),您可以使用

-z lazy
(MinGW 也使用的链接器)指定
ld
选项(无论如何这是默认值)。

据我所知,i386 PE 目标(适用于 Windows)没有有显式的延迟链接选项。我找不到任何可用的文档。


2
投票

您可以使用

--output-delaylib
dlltool
参数来创建延迟加载的导入库。然后,您可以链接生成的导入库以延迟加载 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 .

此示例的完整版本可在 我的 GitHub 上找到。

有趣的事实:在提出这个问题时,已发布的软件可能不提供此功能。该功能是在提出这个问题之前三个月提交的。

© www.soinside.com 2019 - 2024. All rights reserved.