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

时间:2018-08-06 22:31:19

标签: c dll linker mingw import-libraries

使用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名称的约定?

1 个答案:

答案 0 :(得分:0)

从技术上讲,导入库不能包含静态链接的入口点。

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

This page包括以下注释:

  

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

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

提供此操作不会删除DLL导入信息,它应允许您创建这样的库。我现在正在Mac上工作,因此我无法在家中的Windows系统上访问VS来进行确定的测试。

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