1

我想编写一个小实用程序来调用 C 共享库中的任意函数。用户应该能够列出所有导出的函数,类似于 objdump 或 nm 所做的。我检查了这些实用程序的来源,但它们令人生畏。如果 dl 库也具有此功能,则无法在 google 上找到足够的信息。

(澄清编辑:我不想只调用一个事先知道的函数。我会欣赏你回答中的示例片段。)

4

8 回答 8

2

好吧,我将稍微谈谈 Windows。从 DLL 导出的 C 函数不包含有关类型、名称或参数数量的信息——我也不相信您可以确定给定函数的调用约定。

为了比较,看看 National Instrument 的 LabVIEW 编程环境。您可以从 DLL 导入函数,但在使用给定函数之前,您必须手动输入参数的类型和名称。如果此限制可以,请编辑您的问题以反映这一点。

我不知道 *nix 环境有什么可能。

编辑:关于你的澄清。如果您不提前知道该函数是什么,那么您在 Windows 上就会被搞砸,因为通常您将无法确定函数采用的参数的数量和类型。

于 2008-09-15T20:33:38.287 回答
2

这可能接近您正在寻找的内容:http: //python.net/crew/theller/ctypes/

于 2008-09-15T20:28:40.513 回答
1

你可以试试 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

于 2008-09-15T20:34:07.800 回答
1

一个标准的 API 是 dlopen/dlsym API;AFAIK 它是由 Linux 上的 GNU libc 和 Mac OS X 的标准 C 库 (libSystem) 实现的,它可能由 MinGW 或其他兼容包在 Windows 上实现。

于 2008-09-15T20:53:39.360 回答
1

只有明智的解决方案(无需重新发明轮子)似乎使用 libbfd。缺点是它的文档很少,而且对于我的目的来说有点臃肿。

于 2008-09-17T14:19:07.390 回答
0

nm 和 objdump 的源代码可用。如果您想从规范开始,那么 ELF 就是您要研究的内容。

/艾伦

于 2008-09-15T21:13:29.203 回答
0

我在 Perl 中写过类似的东西。在 Win32 上运行 dumpbin /exports,在 POSIX 上运行 nm -gP。然后,由于它是 Perl,因此使用正则表达式解释结果: / _(\S+)@\d+/ 用于 Win32(stdcall 函数)和 /^(\S+) T/ 用于 POSIX。

于 2008-09-16T00:34:04.730 回答
-1

哎呀!您已经触及了非常依赖于平台的编程主题之一。在 windows 上,你有 DLL,在 linux 上,你有ld.so,ld-linux.so和 mac os x's dyld

于 2008-09-15T23:45:36.467 回答