MinGW/GCC Delay Loaded DLL等效?

qgzx9mmu  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(208)

我正在尝试将一些旧的MSVC C++代码移植到MinGW/GCC。
一个问题是,项目严重依赖于/DELAYLOAD选项,这些选项用于不总是使用的函数,以及正确的dll在运行时所在的位置。
在MinGW/GCC上是否有类似的选项?
此代码针对Windows平台。

monwx1rj

monwx1rj1#

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

bqjvbblv

bqjvbblv2#

在elf目标上(对于类Unix系统),您可以使用ld(MinGW也使用的链接器)指定-z lazy选项(无论如何都是默认选项)。
据我所知,i386 PE目标(用于Windows)没有显式的延迟链接选项。我找不到任何可用的文档。

vsnjm48y

vsnjm48y3#

可以使用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

相关问题