关于符号:以跨平台方式查找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


推荐阅读

    linux查找设备号命令?

    linux查找设备号命令?,设备,系统,信息,名称,分区,网上,情况,软件,技术,工具,

    linux查找网卡的命令?

    linux查找网卡的命令?,地址,系统,网络,实时,工具,信息,技术指标,电脑,状态,

    linux命令和库函数?

    linux命令和库函数?,系统,标准,管理,地址,服务,库函数,环境,平台,第一,状态,1

    字符串查找命令linux?

    字符串查找命令linux?,系统,字符串,工具,信息,文件,命令,字符,选项,文本,范

    linux查找帮助的命令?

    linux查找帮助的命令?,系统,命令,信息,软件,名称,文件,指令,进程,表示,参数,l

    linux查找帮助的命令?

    linux查找帮助的命令?,系统,命令,信息,软件,名称,文件,指令,进程,表示,参数,l

    linux查找重复项命令?

    linux查找重复项命令?,工具,系统,电脑,百度,文件,命令,情况,名字,标准,通用,l

    linux命令查找进程?

    linux命令查找进程?,系统,名称,软件,状态,进程,电脑,信息,命令,材料,数据,怎

    linux查看函数命令?

    linux查看函数命令?,系统,信息,名称,命令,位置,情况,公用,名字,标准,资料,lin

    linux命令查找日志?

    linux命令查找日志?,地址,信息,系统,名称,对比,状态,实时,命令,日志,等级,lin

    linux查找php命令?

    linux查找php命令?,服务,信息,系统,名称,工具,软件,网络,代码,工作,网站,Linu

    linux命令查找内容?

    linux命令查找内容?,命令,文件,网络,名称,信息,工作,标准,系统,管理,位置,lin

    linux使用命令的方法?

    linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,

    linux数据库查找命令?

    linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,

    调用函数命令linux?

    调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎

    linux查找包的命令?

    linux查找包的命令?,基础,软件,项目,数据,名称,命令,环境,技术,文件,子目录,

    linux二进制执行命令?

    linux二进制执行命令?,系统,工作,情况,代码,信息,位置,地址,命令,文件,目录,L

    linux命令查找字符串?

    linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文

    linux查找权限命令?

    linux查找权限命令?,系统,地址,工作,命令,文件,信息,概念,时间,标准,权限,Lin

    linux查找和替换命令?

    linux查找和替换命令?,工作,系统,数据,字符串,文件,命令,实时,管理,首次,信