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

时间:2010-06-23 15:31:10

标签: c dll dllimport

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

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

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

有没有人知道在C中实现导入库的方法会做同样的jmp技巧吗? (或者编译器是否优化了跟踪调用?)

1 个答案:

答案 0 :(得分:1)

听起来你可能会对我所谓的“功能转发”感兴趣。它允许您从DLL中导出一个函数,该DLL实际上是在不同的DLL中实现的。

应该是最有效的解决方案

  1. 您不需要调用LoadLibrary()/ GetProcAddress()
  2. 从导出dll导入时,加载程序会在导入表中存储实际执行的地址,因此其中一个call和一个jmp
  3. 实现这一点的最简单方法可能是

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

    如果您想知道,这实际上与在链接器命令行上传递“/export:ExportedFuncName=ActualDll.ActualFuncName”相同。也可以使用模块定义(.DEF)文件的exports部分来完成此操作。有关详细信息,请参阅here的底部。