导入库可以同时包含存根和静态代码吗?

Can an import library contain both stubs and static code at the same time?

当使用 mingw-w64 工具链时,我看到 linker 是 linking 存根库而不是直接 linking。比如linker会选择link到libkernel32.a是导入库

这激发了我的好奇心并提出了以下问题:

  1. 往下看,libws2_32.a里面编译了源代码。我反汇编了它,发现它既包含存根又包含代码——就好像它是一个导入库和静态库的混合体。这在 MinGW 环境之外通常是可能的吗 - 有一个包含有效代码的导入库?

来源:https://github.com/mirror/mingw-w64/tree/master/mingw-w64-crt/libsrc/ws2tcpip

  1. 较小的警告问题:link用户之间是否有确定运行时 DLL 名称的一致方法?例如。如果我 link 到 libws2_32.a 那么 linker 推断运行时 DLL 是 ws2_32.dll。这是一个特定于实现的功能,还是有一个约定的约定来存储和定位原始 DLL 名称?

没有技术原因导致导入库不能包含静态链接的入口点。

您想检查它是否正常工作,但一种可能让您成功的方法是对导入库执行后处理步骤以向其中添加静态链接对象。

This page 包括以下注释:

You can use LIB to perform the following library-management tasks:

  • To add objects to a library, specify the file name for the existing library and the filenames for the new objects.

如果此操作不删除 DLL 导入信息,它应该允许您创建这样的库。我现在在工作,在 Mac 上工作,所以我无法在家里的 Windows 系统上访问 VS 来进行测试。

至于链接器如何知道所涉及的 DLL 的名称,它嵌入在导入库中,并从那里嵌入到最终的 EXE 中。