【发布时间】:2022-01-12 04:51:07
【问题描述】:
我有一个简单的 C 代码,它接受一些数字并返回一个字符串。
const char * get_err_string(const uint8_t errcode) {
switch (errcode) {
case 0:
return "No errors";
break;
case 1:
return "Some error";
break;
default:
return "There is no such error code";
break;
}
}
我正在尝试使用函数原型通过ctypes 执行它,但每次都会遇到分段错误。
import ctypes
libc = ctypes.cdll.LoadLibrary("lib.so")
get_err_string = ctypes.CFUNCTYPE(
ctypes.c_char_p, # restype
ctypes.c_uint8 # 1st argument
)(libc.get_err_string)
get_err_string(ctypes.c_uint8(0)) # segmentation fault
令我惊讶的是,稍微不同的代码执行得很好。
import ctypes
libc = ctypes.cdll.LoadLibrary("genevo/c/bin/genevo.so")
get_err_string = libc.get_err_string
get_err_string.restype = ctypes.c_char_p
get_err_string.argtypes = [ctypes.c_uint8]
get_err_string(ctypes.c_uint8(0)) # b'No errors.'
那么,这是为什么呢?有什么我想念的吗?
【问题讨论】:
-
return "No errors"后面的分号丢失。 -
@MarsZ'uh 是的,我的错。我试图给出最小的工作示例并忘记了它。
-
猜猜这是 gdb 需要检查的东西。在两种情况下都设置一个
b get_err_string,并比较regs,尤其是。 %rdi %rsi 和 %rax 因为它们在两个调用中可能不同。请参阅 x86_64 ABI(假设您正在运行最常见的拱门),例如在 p22 上:refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf