导入库的工作原理是什么?

时间:2017-02-17 10:18:08

标签: c++

我听说导入库有“存根”,所以可执行文件知道我们想要的dll和函数。现在我的问题是:那些存根是什么?他们看起来怎么样?可执行文件如何将指针设置为DLL中的正确位置?它是如何知道我们是否正在讨论普通库或导入库,因为它们都是.lib文件?

2 个答案:

答案 0 :(得分:1)

MSVC链接器不直接链接到DLL,它只能链接到静态库(.lib)。

非常粗略地说,导入库是一个普通的静态库,它为每个DLL导出函数都有一个存根函数。

例如,如果DLL具有函数MSDeployPublish并导出void func1(),则相应的导入库将包含存根函数func1

在运行时,"跳跃"将从导入表中获取void __imp__func1() { __asm { jmp dword ptr func1; } }的地址。这就是需要存根的原因。

申请表中的声明func1实际上会引用void __declspec(dllimport) func1();

您可以完全绕过整个机制,并在运行时调用__imp__func1()LoadLibrary获取GetProcAddress的地址。它会产生同样的效果。

答案 1 :(得分:0)

这取决于您使用的编译器(链接器)和平台。

即。在Windows操作系统上,共享库通常是.DLL文件,
如果要链接到它(除了动态加载它并在运行时解析其符号),您需要相应的.LIB文件,即存根库。

基本上,存根库是一个静态库,它将DLL导出的所有符号(带有__declspec(dllexport))重新映射到存根中存在的符号,并且可以使用{在程序中找到并静态链接{1}}。