gpt4 book ai didi

python - 使用 ctypes 从无效函数(段错误)x64 获取指针

转载 作者:行者123 更新时间:2023-11-30 17:28:03 25 4
gpt4 key购买 nike

我已将问题简化为以下玩具文件和命令:

// a.c --> a.out, compiled with `gcc -fPIC -shared a.c`
void* r2() {
return NULL; // <-- could be anything
}

python -i -c
“从 ctypes 导入*;
clib = cdll.LoadLibrary('/home/soltanmm/tmp/a.out');
CFUNCTYPE(c_void_p).in_dll(clib,'r2')()"

^ 直接在 ffi_call_unix64 内进行调用时会导致段错误。

我使用的是运行 Python 2.7 的 AMD64 Linux 计算机。我做错了什么?

编辑

为了强调指针并不重要,这是第二个出现段错误的例子:

// a.c --> a.out
int r1() {
return 1;
}

python -i -c
“从 ctypes 导入*;
clib = cdll.LoadLibrary('/home/soltanmm/tmp/a.out');
CFUNCTYPE(c_int).in_dll(clib,'r1')()"

最佳答案

CFUNCTYPE 用于回调(或指向共享对象中定义为变量的函数的指针)。执行 cdll.LoadLibrary 操作后,您应该能够直接在返回的库对象上调用 C 函数。所以这样的事情应该有效:

from ctypes import *;
clib = cdll.LoadLibrary('/home/soltanmm/tmp/a.out');
print(clib.r2())

方法in_dll通常用于访问从共享对象导出的变量。本身不是函数。使用 in_dll 的示例如下所示:

文件a.c:

#include <stdlib.h>

int r2() {
return 101;
}

int (*f)(void) = r2;
char *p = "Hello World";

char *gethw() {
return p;
}

Python 脚本:

from ctypes import *;
clib = cdll.LoadLibrary('/home/soltanmm/tmp/a.out');

# print should call r2() since f is a variable initialized to
# point to function r2 that returns an int. Should
# print 101
print (CFUNCTYPE(c_int).in_dll(clib,'f')())

# or call r2 directly
print(clib.r2())

# prints out the character (char *) string variable `p'
# should result in 'Hello World' being printed.
print((c_char_p).in_dll(clib,'p').value)

# call the gethw() function that returns a point to a char *
# This too should print 'Hello World'
# we must set the restype c_char_p explicitly since the default
# is to assume functions return `int`
gethw = clib.gethw
gethw.restype = c_char_p
print(gethw())

有关 ctypes 用法的更多信息,请参阅 Python Documentation

关于python - 使用 ctypes 从无效函数(段错误)x64 获取指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26171020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com