共享库接口的自省

共享库接口的自省

我第一次使用的库有问题(它是 Boost.Python,但我的问题比这个案例更普遍)。

因此,我需要检查我构建的库的接口是什么:以便检查我是否至少正确构建了所有内容。

(Python 抱怨他没有看到我的模块,尽管我将 .pyd 中重命名的 .so 放入其 PYTHONPATH 中,所以我的库中有问题)

我需要知道 .so 库的所有公开函数的名称,以及它们的原型(如果可能)。

是否有我可以安装的命令或软件包来实现类似的目的?

答案1

您可以从 ELF 文件(可执行文件或库)中获取信息readelf

看起来您正在寻找导出的符号,因此使用:

$ readelf --dyn-syms libyourthing.so

对于 C 类型函数,您只能获取函数名称,而不能获取参数类型或返回值。对于 C++ 函数,您将得到损坏的名称 - 通过管道传输该命令的输出c++filt以获取函数名称和参数类型(但仍然没有返回值)。
(全局变量也显示在输出中,包含它们的名称和大小,但不包含它们的类型。)

其他有用的工具有nm和 ,objdump它们提供类似的信息。

但我不确定这会对你有帮助。你还应该尝试strace看看 python 是否正在寻找你认为它在哪里。就像是:

$ strace -e trace=open python your_code_that_loads_your_lib.py

将显示openpython 执行的所有调用 - 在其中查找您的库名称(会有一个很多由上面记录,过滤它)。每次调用还会显示返回代码,因此您可能会更好地了解正在发生的情况。

哦,请确保您没有尝试将 32 位库加载到 64 位 python 运行时中,反之亦然。

相关内容