gpt4 book ai didi

python - 使用 Python ctypes 的 C 函数名称相关段错误

转载 作者:太空狗 更新时间:2023-10-29 15:54:30 30 4
gpt4 key购买 nike

在 Python 中使用 ctypes 时,我遇到了一个非常奇怪的崩溃,但我不确定问题是来自 Python 还是 C。

这是 C 源代码(在 test.c 中):

#include <stdio.h>

void compress(char *a, int b) {
printf("inside\n");
}

void run() {
printf("before\n");
compress("hi", 2);
printf("after\n");
}

下面是我用 ctypes 调用 run() 时发生的情况:

$ python -c 'import ctypes; ctypes.cdll.LoadLibrary("./test.so").run()'
before
Segmentation fault (core dumped)

最奇怪的是,当我将 compress() 重命名为其他任何名称时,崩溃并没有发生。

其他防止崩溃的事情:

  • 直接调用compress()
  • 直接从 C 调用 run()compress()(如果我添加一个 main(),直接编译它,然后执行它)
  • compress() 的签名中删除任一参数(但由于缺少“inside”,因此该函数似乎无法执行。

我是 C 的新手,所以我假设这里缺少某些东西。可能是什么原因造成的?

系统信息:
Python 2.7.6
gcc 版本 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)
Ubuntu 14.04
uname -r:3.13.0-58-generic

最佳答案

根据调试,程序试图调用libz.so.1中的compress

$ gdb python -c core
...
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `python -c import ctypes; ctypes.cdll.LoadLibrary("./test.so").run()'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00007f9ddea18bff in compress2 () from /lib/x86_64-linux-gnu/libz.so.1

它接受不同的参数(zlib.h):

ZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,
const Bytef *source, uLong sourceLen));

ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen,
int level));
/*

您可以将 compress 函数修改为 static 以解决此问题:

static void compress(char *a, int b)
{
printf("inside\n");
}

关于python - 使用 Python ctypes 的 C 函数名称相关段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31689472/

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