共享库接口自省

Ste*_*and 3 linux libraries

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

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

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

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

是否有我可以安装的命令或包来实现这样的目标?

Mat*_*Mat 5

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

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

$ readelf --dyn-syms libyourthing.so
Run Code Online (Sandbox Code Playgroud)

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

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

不过我不确定这对你有帮助。您还应该尝试strace查看 python 是否正在寻找您认为的位置。就像是:

$ strace -e trace=open python your_code_that_loads_your_lib.py
Run Code Online (Sandbox Code Playgroud)

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

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


归档时间:

查看次数:

2528 次

最近记录:

12 年,11 月 前