我正在尝试将一些旧的MSVC C++代码移植到MinGW/GCC。一个问题是,项目严重依赖于/DELAYLOAD选项,这些选项用于不总是使用的函数,以及正确的dll在运行时所在的位置。在MinGW/GCC上是否有类似的选项?此代码针对Windows平台。
monwx1rj1#
我想补充的是,尽管延迟加载DLL看起来是Windows操作系统的一部分,但实际上它们是以链接器生成的小存根的形式实现的。至少,过去是这样的。所以在Windows操作系统级别上没有正式的“延迟加载”概念。有一个约定,基于链接器发出的二进制代码。
bqjvbblv2#
在elf目标上(对于类Unix系统),您可以使用ld(MinGW也使用的链接器)指定-z lazy选项(无论如何都是默认选项)。据我所知,i386 PE目标(用于Windows)没有显式的延迟链接选项。我找不到任何可用的文档。
ld
-z lazy
vsnjm48y3#
可以使用dlltool的--output-delaylib参数来创建延迟加载的导入库。然后可以链接生成的导入库以延迟加载DLL。作为延迟加载现有DLL的一个例子,假设您想要延迟加载Windows DLL version.dll,它导出GetFileVersionInfoSizeW。首先,我们在version.def文件中定义我们想要调用的函数:
dlltool
--output-delaylib
version.dll
GetFileVersionInfoSizeW
version.def
EXPORTS GetFileVersionInfoSizeW
字符串然后我们可以使用dlltool创建一个延迟加载的导入库:
dlltool --input-def version.def --output-delaylib version.lib --dllname version.dll
型链接时,使用结果version.lib:
version.lib
gcc -o test test.c -lversion -L .
型此示例的完整版本可在my GitHub上获得。有趣的事实:在提出此问题时,此功能可能在已发布的软件中不可用。此功能在提出此问题之前已提交three months。
3条答案
按热度按时间monwx1rj1#
我想补充的是,尽管延迟加载DLL看起来是Windows操作系统的一部分,但实际上它们是以链接器生成的小存根的形式实现的。至少,过去是这样的。所以在Windows操作系统级别上没有正式的“延迟加载”概念。有一个约定,基于链接器发出的二进制代码。
bqjvbblv2#
在elf目标上(对于类Unix系统),您可以使用
ld
(MinGW也使用的链接器)指定-z lazy
选项(无论如何都是默认选项)。据我所知,i386 PE目标(用于Windows)没有显式的延迟链接选项。我找不到任何可用的文档。
vsnjm48y3#
可以使用
dlltool
的--output-delaylib
参数来创建延迟加载的导入库。然后可以链接生成的导入库以延迟加载DLL。作为延迟加载现有DLL的一个例子,假设您想要延迟加载Windows DLL
version.dll
,它导出GetFileVersionInfoSizeW
。首先,我们在version.def
文件中定义我们想要调用的函数:字符串
然后我们可以使用
dlltool
创建一个延迟加载的导入库:型
链接时,使用结果
version.lib
:型
此示例的完整版本可在my GitHub上获得。
有趣的事实:在提出此问题时,此功能可能在已发布的软件中不可用。此功能在提出此问题之前已提交three months。