我听说导入库有“存根”,所以可执行文件知道我们想要哪个dll和函数。现在我的问题是:那些存根是什么?他们看起来怎么样?可执行文件如何将指针设置为DLL中的正确位置?它是如何知道我们是否在谈论普通库或导入库,因为它们都是.lib文件?导入库如何工作?
导入库如何工作?
回答
MSVC链接器不直接链接到DLL,它只能链接到静态库(.lib)。
非常粗略地说,一个导入库是一个正常的静态库,对每个DLL导出的函数都有一个存根函数。
例如,如果一个DLL具有的功能void func1()
和出口func1
,相应的导入库将包含存根函数void __imp__func1() { __asm { jmp dword ptr func1; } }
在运行时,“跳”将采取func1
地址从导入表。这就是为什么需要存根。
申请中的声明void __declspec(dllimport) func1();
实际上是指__imp__func1()
。
您可以绕过这整个机制,并在运行时拨打LoadLibrary
和GetProcAddress
以获取地址func1
。它会有同样的效果。
这取决于您使用的编译器(链接器)和平台。
I.e.在Windows操作系统上,共享库通常是.DLL文件,如果要链接到它(除了动态加载它并在运行时解析其符号),则需要相应的.LIB文件,即存根库。
基本上存根库是重新映射由DLL输出(与__declspec(dllexport)
)的所有符号中存在的存根和,可以发现,通过使用__declspec(dllimport)
程序内的静态链接符号的静态库。
那么__declspec(dllexport)是来自Windows API的函数,还是Visual Studio中的指令? –
@Daniel Nyman:'__declspec'是一个关键字(据我所知,特定于Visual Studio),'dllexport'和'dllimport'是该关键字的属性。更多信息,请访问:https://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx – roalz
[__declspec](https://msdn.microsoft.com/en-us/library/dabb5z75.aspx)是一个关键字,它分配一个Microsoft特定的存储类属性。 – IInspectable
- 1. IBM SQL数据库导入工作不
- 2. 导入库创建不工作
- 3. 导入的类型库不再工作
- 4. 静态库的导入如何在Java/Spring中工作?
- 5. 在clojure中导入java库,它是如何工作的?
- 6. 如何导入库到Android工作室0.4.3
- 7. 如何将JBLAS库导入到Android工作室
- 8. 如何导入现有的Android库项目到Eclipse工作
- 9. 如何导入库?机器人工作室1.4
- 10. 此导入声明如何工作?
- 11. Objective-C导入过程如何工作?
- 12. Python导入如何正确工作?
- 13. 这个Python导入如何工作?
- 14. 快速包导入如何工作?
- 15. 导入工作不
- 16. 如何导入工作表的列以激活工作簿
- 17. 在python绝对导入不工作,相对导入工作
- 18. 如何将库导入Intellij?
- 19. 如何导入com.google.api.client库?
- 20. 如何导入规格库
- 21. python newbie - 如何导入库
- 22. 导入Github库并只与库一起工作
- 23. 将VHDL软件包从工作库以外的库导入SV
- 24. HBASE备份 - java api如何导出/导入工作?
- 25. 如何导入和导出JBPM 6.5库
- 26. phpMyAdmin导出如何工作?
- 27. 导入keras.datasets不工作
- 28. Scipy.misc导入不工作
- 29. 导入Gdal不工作
- 30. Adaljs - 导入不工作角
另请参阅https://msdn.microsoft.com/en-us/magazine/bb985992.aspx –
可执行文件不知道这些。它是链接器,它会发出适当的代码。 – IInspectable