0

使用mingw-w64工具链时,我看到链接器正在链接存根库而不是直接链接。例如,链接器将选择链接到libkernel32.a哪个是导入库。

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

  1. 请参阅下文以查找其中libws2_32.a已编译的源代码。我反汇编它,发现它包含存根和代码——好像它是一个导入库和静态库混合。这通常在 MinGW 环境之外是可能的吗 - 有一个包含有效代码的导入库?

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

  1. 较小的警告问题:链接器之间是否有确定运行时 DLL 名称的商定方法?例如,如果我链接到libws2_32.a然后链接器推断运行时 DLL 是ws2_32.dll. 这是一个特定于实现的功能,还是有一个约定的约定来存储和定位原始 DLL 名称?
4

1 回答 1

0

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

您想检查这是否正常工作,但可能让您到达那里的一种方法是在导入库上执行后处理步骤以将静态链接对象添加到其中。

此页面包括以下注释:

您可以使用 LIB 执行以下库管理任务:

  • 要将对象添加到库,请指定现有库的文件名和新对象的文件名。

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

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

于 2018-08-06T23:04:00.917 回答