是否可以在Python中自动检测动态库中的函数?

时间:2015-05-27 14:19:28

标签: python c ctypes

当我想在Python中使用防锈代码时,我会在rust

中写下类似的内容
#![crate_type = "dylib"]

#[no_mangle]
pub extern fn fib(n: u32) -> u32 {
    if n <= 1 {
        return n;
    } else {
        return fib(n-1) + fib(n-2);
    }
}

然后使用Python中的以下内容来使用代码。

#!/usr/bin/env python

import ctypes

fiblib = ctypes.CDLL("./libfibonacci.so")
fib = fiblib.fib
n = 37
print("The %ith Fibonacci number is %i." % (n, fib(n)))

但是,我必须知道有一个函数fib,它接受​​一个整数作为参数并返回一个整数。

是否可以自动检测动态库中的哪些功能?

是否可以以这样的方式编写/编译rust(或C)代码,以便用Python自动检测它?

2 个答案:

答案 0 :(得分:2)

在Linux上,您可以使用objdump --dynamic-syms之类的工具列出由共享库导出的所有动态符号。

导出.text部分中的符号,并且函数具有标记DF

0000000000005586 g    DF .text  0000000000000024  Base        gtkspell_attach

导入的功能可以通过DF *UND*标识:

0000000000000000      DF *UND*  0000000000000000              g_free

找出函数所采用的参数及其返回的唯一方法是查看可选的调试信息。

答案 1 :(得分:1)

您可以使用readelf;但是以Python编程方式使用它并不是一件容易的事情,看起来它只会为C和C ++的错误名称命名。

请参阅:Introspection of the interface of a shared library

NB:共享库中的信息不存储有关C的函数参数的信息;对于C ++,当你得到 mangled 名称时,可以使用c++filt demangle 并获取函数参数。

但是,您可能需要查看ctypesgen一个工具,该工具可用于自动为您生成ctypes模块给定Header文件{ {1}}。