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

时间:2020-03-05 18:54:25  来源:igfitidea点击:

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

(说明编辑:我不想只调用一个事先已知的函数。我将感谢我们回答中的示例片段。)

解决方案

回答

这可能与我们要查找的内容接近:
http://python.net/crew/theller/ctypes/

回答

好吧,我会讲一些有关Windows的知识。从DLL导出的C函数不包含有关类型,名称或者参数数量的信息-我也不相信我们可以确定给定函数的调用约定。

为了进行比较,请看一下National Instruments的LabVIEW编程环境。我们可以从DLL导入函数,但是在使用给定函数之前,必须手动键入参数的类型和名称。如果此限制可以,请编辑问题以反映该问题。

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

编辑:关于澄清。如果我们不知道函数会提前做什么,那么我们在Windows上就很困惑,因为通常我们将无法确定函数采用的参数数量和类型。

回答

我们可以尝试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上实现。

回答

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

/艾伦

回答

ek!我们已经涉及了非常依赖平台的编程主题之一。在Windows上,我们具有DLL;在Linux上,我们具有ld.so,ld-linux.so和mac os x的dyld。

回答

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

回答

只有明智的解决方案(无需重新发明轮子)似乎使用libbfd。缺点是它的文档稀少,就我的目的而言,它有点肿。