C / Python ctypes 共享对象反射库/技术

2 投票
2 回答
1586 浏览
提问于 2025-04-16 05:30

我在寻找一种方法,想要列出在一个用C语言编写的共享对象中定义的.text部分的符号,这个共享对象是通过Python的ctypes库加载的。简单来说,我想获取一个CDLL加载的对象中定义的函数列表。

如果用ctypes或者相关的库(或者Python绑定)无法做到这一点,另一种选择是使用一个Python的ELF解析库,或者像http://halflifelibrary.com/wiki/Metamod-P这样的解决方案。

有没有办法做到这一点呢?

2 个回答

1

在你尝试获取dll导出的函数列表的方法中,增加了一种新的方法。

有一个脚本可以在这个链接找到:http://projects.scipy.org/numpy/wiki/MicrosoftToolchainSupport。这个脚本可以提取dll的符号表,解析出公共表,并把这个表输出到一个.def文件中。不过,它也提到如果dll被剥离(也就是去掉了一些信息),这个方法可能就不管用了。

我不确定在Python中是否有好的ELF解析器。这里列出了一些我找到的:

0

顺便说一下,使用ctypes加载的共享对象是无法获取已定义方法的列表的,因为这个对象的结构没有元信息。

如果你需要一个特定平台的对象解析器,或许可以看看这个链接:http://projects.scipy.org/numpy/wiki/MicrosoftToolchainSupport,它使用objdump工具来获取文本部分定义的函数引用。

我建议的做法是使用像Hachoir这样的ELF解析库,或者Pydevtools,写一个小解析器来检查这个对象。

撰写回答