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

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

what is the easiest way to lookup function names of a c binary in a cross-platform manner?

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

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


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

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

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

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


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


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


一种标准的API是dlopen / dlsym API。 AFAIK由Linux和Mac OS X的标准C库(libSystem)上的GNU libc实现,并且可能由MinGW或其他兼容软件包在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


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


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

/艾伦


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


推荐阅读