以跨平台方式查找c二进制函数名称的最简单方法是什么?
我想编写一个小的实用程序,以从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。缺点是它的文档稀少,就我的目的而言,它有点肿。