我想编写一个小实用程序来调用 C 共享库中的任意函数。用户应该能够列出所有导出的函数,类似于 objdump 或 nm 所做的。我检查了这些实用程序的来源,但它们令人生畏。如果 dl 库也具有此功能,则无法在 google 上找到足够的信息。
(澄清编辑:我不想只调用一个事先知道的函数。我会欣赏你回答中的示例片段。)
好吧,我将稍微谈谈 Windows。从 DLL 导出的 C 函数不包含有关类型、名称或参数数量的信息——我也不相信您可以确定给定函数的调用约定。
为了比较,看看 National Instrument 的 LabVIEW 编程环境。您可以从 DLL 导入函数,但在使用给定函数之前,您必须手动输入参数的类型和名称。如果此限制可以,请编辑您的问题以反映这一点。
我不知道 *nix 环境有什么可能。
编辑:关于你的澄清。如果您不提前知道该函数是什么,那么您在 Windows 上就会被搞砸,因为通常您将无法确定函数采用的参数的数量和类型。
这可能接近您正在寻找的内容:http: //python.net/crew/theller/ctypes/
你可以试试 ParaDyn 的 SymtabAPI。它使您可以获取共享库(或可执行文件)中的所有符号并查看它们的类型、偏移量等。它都包含在一个相当不错的 C++ 接口中,并且可以在许多平台上运行。它还提供对二进制重写的支持,您可以在运行时使用它来执行您正在谈论的事情。
网页在这里:
http://www.paradyn.org/html/symtab2.1-features.html
文档在这里:
http://ftp.cs.wisc.edu/paradyn/releases/release5.2/doc/symtabProgGuide.21.pdf
一个标准的 API 是 dlopen/dlsym API;AFAIK 它是由 Linux 上的 GNU libc 和 Mac OS X 的标准 C 库 (libSystem) 实现的,它可能由 MinGW 或其他兼容包在 Windows 上实现。
只有明智的解决方案(无需重新发明轮子)似乎使用 libbfd。缺点是它的文档很少,而且对于我的目的来说有点臃肿。
nm 和 objdump 的源代码可用。如果您想从规范开始,那么 ELF 就是您要研究的内容。
/艾伦
我在 Perl 中写过类似的东西。在 Win32 上运行 dumpbin /exports,在 POSIX 上运行 nm -gP。然后,由于它是 Perl,因此使用正则表达式解释结果: / _(\S+)@\d+/ 用于 Win32(stdcall 函数)和 /^(\S+) T/ 用于 POSIX。
哎呀!您已经触及了非常依赖于平台的编程主题之一。在 windows 上,你有 DLL,在 linux 上,你有ld.so
,ld-linux.so
和 mac os x's dyld
。