当我想在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自动检测它?
答案 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}}。