我听说导入库有“存根”,所以可执行文件知道我们想要哪个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. 如何将JBLAS库导入到Android工作室
- 5. 这个Python导入如何工作?
- 6. 在python绝对导入不工作,相对导入工作
- 7. python newbie - 如何导入库
- 8. 如何导入com.google.api.client库?
- 9. 如何导入和导出JBPM 6.5库
- 10. 导入nltk不工作
- 11. kivy导入android不工作
- 12. 导入罐不工作
- 13. 导入Gdal不工作
- 14. Adaljs - 导入不工作角
- 15. phpMyAdmin导出如何工作?
- 16. NW.js + Babel:ES6导入工作但不导出?
- 17. 如何将数据从工作表导入到同一工作簿中的powerpivot
- 18. 输入值如何工作?
- 19. 将MSSQL数据库备份导入到MySQL工作台
- 20. MySQL工作台恢复数据库,然后导入数据
- 21. 从一个Excel工作表导入到数据库表
- 22. 导入Excel工作表到Mongodb数据库与列映射
- 23. 将git工作目录导入到第二个git存储库
- 24. 如何导入动作库和调用函数?
- 25. 如何使python命令行程序作为python库导入?
- 26. 如何模拟,以便`从x导入*`工作
- 27. 如何导入所需列的工作表? Excel VBA
- 28. 如何让这些相对导入在Python 3中工作?
- 29. 如何使用FileDialog导入选定的工作表?
- 30. python中的导入关键字如何实际工作?
另请参阅https://msdn.microsoft.com/en-us/magazine/bb985992.aspx –
可执行文件不知道这些。它是链接器,它会发出适当的代码。 – IInspectable