【发布时间】:2010-12-23 12:04:30
【问题描述】:
我正在尝试将一些旧的 MSVC C++ 代码移植到 MinGW/GCC。
一个问题是该项目在很大程度上依赖于 /DELAYLOAD 选项来处理并不总是使用的函数,以及运行时正确的 dll 所在的位置。
MinGW/GCC 上有类似的选项吗?
此代码针对 windows 平台。
【问题讨论】:
标签: c++ visual-studio gcc mingw visual-c++
我正在尝试将一些旧的 MSVC C++ 代码移植到 MinGW/GCC。
一个问题是该项目在很大程度上依赖于 /DELAYLOAD 选项来处理并不总是使用的函数,以及运行时正确的 dll 所在的位置。
MinGW/GCC 上有类似的选项吗?
此代码针对 windows 平台。
【问题讨论】:
标签: c++ visual-studio gcc mingw visual-c++
我还要补充一点,虽然延迟加载 DLL 似乎是 Windows 操作系统的一部分,但它们实际上是根据链接器生成的小存根实现的。至少,以前是这样的。因此,在 Windows 操作系统级别没有正式的“延迟加载”概念。有一个约定,基于链接器发出的二进制代码。
【讨论】:
QueryOptionalDelayLoadedAPI
在 elf 目标(对于类 Unix 系统)上,您可以使用 ld(MinGW 也使用的链接器)指定 -z lazy 选项(无论如何都是默认选项)。
据我所知,i386 PE 目标(适用于 Windows)没有有明确的惰性链接选项。我找不到任何可用的文档。
【讨论】:
-z lazy 启用延迟符号解析,但始终加载共享库。 /DELAYLOAD 启用延迟链接,即延迟库的加载,直到调用其中一个函数(Solaris 具有此功能,但由于某种原因它没有进入 Glibc,因为 Drepper^W^W)。
/DELAYLOAD 的目的跨度>
您可以使用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。
【讨论】: