VC++ 在使用没有代码的静态库时是否会添加对 LoadLibrary 的调用?

Does VC++ add calls to LoadLibrary when using static libraries that don't have code?

本文关键字:是否 添加 调用 LoadLibrary 静态 VC++ 代码      更新时间:2023-10-16

请原谅我对静态库的命名法,但我的意思是谈论没有代码的静态库(.lib),而只是通过获取dll并使其成为导入库生成的引用。

我是否正确理解编译器 (MSVC++) 在这种情况下添加了类似 LoadLibrary("foo.dll")的代码;GetProcAddress("barMethod");何时在 C++ 代码中引用?

有没有办法确定它是否真的这样做?

也许使用某种静态分析工具来告诉我生成了什么代码?

静态库有代码。没有代码的 .lib 文件不是静态库,而是导入库(正如您正确观察到的那样)。

在这种情况下,VC++可以做两件事。默认设置是将导入库编译为导入地址表 (IAT)。在运行时,操作系统将解析引用。另一种称为延迟-负载链接。在这种情况下,VC++确实会插入对LoadLibrary和GetProcAddress的调用。

依赖 Walker 仍然是观察这一切如何工作的相关工具。

如果将程序与某些库 (.lib) 链接,而该库只是某些.dll的导出库,编译器不会调用(或添加此类代码的某些代码)任何 LoadLibrary 或 smth。它不取决于您使用的编译器。

.dll始终在应用程序启动的那一刻由操作系统加载(编辑:延迟加载链接的情况除外)(在使用导入库的静态链接的情况下)。编译器仅创建必须从.dll加载的名称列表。此列表称为导入表。