2010-06-23 45 views
1

生成的导入库(用于链接将加载dll的程序的库)AFAICS以汇编jmp statings的形式实现对导入函数的各种调用。如何用简单的jmp程序集实现import lib?

这确实看起来像是一个非常优化的解决方案。它不需要再次推理,也不需要从呼叫中返回。

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

有没有人知道一种方法来在C实现一个导入库,会做同样的jmp诡计? (或者编译器是否优化了路径调用?)

+1

我不是很清楚你在这里问什么。首先你说导入库是这样做的,然后你问如何让他们这样做。你能澄清吗? – torak 2010-06-23 15:46:37

回答

1

听起来像你可能会对我所谓的“函数转发”感兴趣。它允许你从一个真正在不同DLL中实现的DLL中导出一个函数。

应该差不多是最有效的解决方案

  1. 你不需要给LoadLibrary()/ GetProcAddress的()的调用
  2. 当您从DLL导出导入,加载存储的地址真正impmplementation在导入表,所以它的一个call和一个jmp

可能实现这个最简单的方法是用类似

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

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

+0

不错的技术。但转发不适用:我不想创建一个DLL,我想创建一个静态库。 – 2010-06-23 17:10:16

+0

@Didier Trosset:好的,所以还需要别的东西。这是一个32位还是一个64位?它影响了易用性,可以使用汇编代码。 – torak 2010-06-23 17:22:58