像 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 -D
或 readelf -s
?
我想列出 .so
文件的所有动态符号。
提前致谢!
【问题讨论】:
具体是什么问题?大概您需要在某个时候阅读 API? 嗨,我只是想在.so
图书馆找点乐子。
【参考方案1】:
我的回答是:不,ctypes
极不可能为您提供库中所有可用符号的枚举。
原因主要在ctypes
作为Python模块的范围内,以及动态库API的范围内:POSIX dlopen
+dlsym
或Win32 LoadLibrary
+GetProcAddress
。这些 API 的主要任务是加载 DLL 并通过符号名称/序号获取可调用地址。它们不是为符号枚举设计的。您不能使用它们列出符号;和 CPython relies on them,当然,实现它的功能。
还需要说明的是,您提到的nm
和readelf
工具自己解析可执行文件以获取符号列表。这与将库作为可执行模块加载到内存中非常相干。因此,您将需要一个不同的 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 一样运行
jQuery and Grails/HTML - 像 Google 一样使文本字段成为完整的文本