c - 如何用简单的 jmp 程序集实现 import lib?

标签 c dll dllimport

生成的导入库(用于链接将加载 dll 的程序的库)AFAICS 将对导入函数的各种调用实现为程序集 jmp 语句。

这看起来确实是一个非常理想的解决方案。它不需要第二次推送参数,也不需要从调用中返回。

我想创建自己的导入库,在其中添加一些其他函数。为此,我必须调用 LoadLibrary()GetProcAddress() 函数来获取 dll 中函数的地址。但是,我必须提供我自己的函数,这些函数将通过函数地址调用导入的函数。但这意味着两次调用,并再次将参数压入堆栈。我希望优化此双重调用。

有谁知道在 C 中实现导入库的方法,该导入库可以执行相同的 jmp 技巧? (或者编译器是否优化了跟踪调用?)

最佳答案

听起来您可能对我认为称为“函数转发”的东西感兴趣。它允许您从一个 DLL 中导出一个函数,该函数实际上是在一个不同的 DLL 中一起实现的。

应该是关于最高效的解决方案

  1. 您不需要调用 LoadLibrary()/GetProcAddress()
  2. 当您从导出的 dll 导入时,加载程序将实际实现的地址存储在导入表中,因此它是一个 call 和一个 jmp

可能最简单的实现方法是使用类似的东西

#pragma comment(linker, "/export:ExportedFuncName=ActualDll.ActualFuncName")

如果您想知道,这与在链接器命令行上传递“/export:ExportedFuncName=ActualDll.ActualFuncName”实际上是一样的。也可以使用模块定义 (.DEF) 文件的导出部分来执行此操作。见here底部了解详情。

关于c - 如何用简单的 jmp 程序集实现 import lib?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3103096/

相关文章:

c# - 使用 Visual Studio 2012 分析 .NET 类库时未收集任何数据

dll - 在生产环境中设置NSASS?

c# - 树莓派上的单声道在共享对象 (.so) 文件的 DLLImport 处抛出 DLLNotFoundException

c - 从c中的文件中读取2个整数

c - 获取链接静态库时使用的存档成员列表

c++ - 在 C++ 中读取和写入同一个二进制文件

c# - 如何计算文件的增量,即更改的文件部分

delphi - 我们可以在运行时使用dcu(Delphi编译单元)吗?

c++ - 使用来自 C++ 程序的 dll。 (borland c++ builder 和一般)

c# - 将 C++ 自定义库函数导入到 C# 中