以跨平台的方式查找c二进制文件的函数名最简单的方法是什么?

问题描述:

我想编写一个小实用程序来调用C共享库中的任意函数。用户应该能够列出与objdump或nm相似的所有导出函数。我检查了这些公用事业的来源,但他们是恐吓。如果dl库具有此功能,则无法在Google上找到足够的信息。以跨平台的方式查找c二进制文件的函数名最简单的方法是什么?

(编辑澄清:我不想只是调用这是预先知道的功能,我会感激你一起回答一个例子片段。)

这可能是接近你在找什么: http://python.net/crew/theller/ctypes/

+0

使用ctypes,您必须知道参数的数量和类型提前。这违背了OP的'澄清编辑'。 请参阅: http://python.net/crew/theller/ctypes/tutorial.html#specifying-the-required-argument-types-function-prototypes – Kevin 2008-09-15 21:02:08

那么,我会讲一点关于Windows。从DLL导出的C函数不包含有关类型,名称或参数数量的信息 - 也不相信您可以确定给定函数的调用约定。

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

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

编辑:关于你的澄清。如果你不知道函数提前什么时候,那么你会非常容易搞砸Windows,因为一般来说,你将无法确定函数的参数数目和类型。

+0

我不必做一个stdcall所以我不'不用担心调用堆栈。 据我记得,DLL文件仍然保留一些关于导出的功能,如mangled名称的信息。 – artificialidiot 2008-09-15 21:08:47

+0

保留了隐藏的名称,并可以告诉您C++库的参数信息(假设您知道如何解除名称)。但是OP指定了“C”。 MSVC有时会调用调用约定的C名称和参数的总大小(以字节为单位) - 但您仍缺少关键信息。 – Kevin 2008-09-15 21:29:45

您可以尝试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和Mac OS X的标准C库(libSystem)上的GNU libc实现,它可能由MinGW或其他兼容包在Windows上实现。

+0

任何人都可以提供一个使用这个API的例子吗? – artificialidiot 2008-09-15 21:00:26

nm和objdump的源代码可用。如果你想从规范开始,那么ELF就是你想要看的东西。

/Allan

Eek!您已经谈到了编程的一个非常依赖平台的主题。在Windows上,你有DLL,在Linux上,你有ld.so,ld-linux.so和mac os x的dyld

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

只有合理的解决方案(没有重新发明*)似乎使用libbfd。缺点是它的文档很少,对我的目的来说有点臃肿。