像 nm -D 或 readelf -s 一样,使用 python ctypes 列出动态符号?

Posted

技术标签:

【中文标题】像 nm -D 或 readelf -s 一样,使用 python ctypes 列出动态符号?【英文标题】:like nm -D or readelf -s, list dynamic symbols with python ctypes? 【发布时间】:2012-08-04 06:26:47 【问题描述】:

是否可以使用 python ctypes 实现 nm -Dreadelf -s

我想列出 .so 文件的所有动态符号。

提前致谢!

【问题讨论】:

具体是什么问题?大概您需要在某个时候阅读 API? 嗨,我只是想在.so 图书馆找点乐子。 【参考方案1】:

我的回答是:ctypes 极不可能为您提供库中所有可用符号的枚举。

原因主要在ctypes作为Python模块的范围内,以及动态库API的范围内:POSIX dlopen+dlsym或Win32 LoadLibrary+GetProcAddress。这些 API 的主要任务是加载 DLL 并通过符号名称/序号获取可调用地址。它们不是为符号枚举设计的。您不能使用它们列出符号;和 CPython relies on them,当然,实现它的功能。

还需要说明的是,您提到的nmreadelf 工具自己解析可执行文件以获取符号列表。这与将库作为可执行模块加载到内存中非常相干。因此,您将需要一个不同的 Python 模块来执行此操作,例如 python-elf

【讨论】:

所以基本上nm 所做的是打开二进制文件,逐字节读取,然后打印收集的结果?我搜索了nm,发现它正在调用libbfd。我们可以通过ctypes调用libbfd来获取动态符号吗? @est,是的,你基本上是对的。这些工具逐字节读取 ELF 文件,解析它们,然后打印出一些收集的表。 libbfd 只是一个binutils library,它为这些工具完成了所有的繁重工作。当然,您可以使用libbfd API 在ctypes 之上构建该库的接口,但很可能已经在python 库(如python-elf 或类似的东西)中完成了。 谢谢!那么可以用ctypes列出所有.so文件的导出功能吗?你知道 Windows 下类似的东西吗?

以上是关于像 nm -D 或 readelf -s 一样,使用 python ctypes 列出动态符号?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 Python 脚本像 Linux 中的服务或守护程序一样运行

使 UItextfield 像 UISearchBar 一样运行

如何使我的 php 项目像 .exe 文件一样可分发

jQuery and Grails/HTML - 像 Google 一样使文本字段成为完整的文本

使 Windows 上的字体像 Mac/Linux 一样渲染:禁用字体提示和/或在客户端处理抗锯齿

C语言怎样使libxml像数据库一样动态创建节点哇