错误“ELF 类错误”使用 ctypes

发布于 2024-11-09 15:54:51 字数 794 浏览 5 评论 0原文

从 32 位 Ubuntu 安装更改为 64 位 Ubuntu 安装后,我的 python+ctypes+c99 代码被破坏。到目前为止,我读到错误 ./libfoo.so: error ELF class: ELFCLASS32 意味着我的 libfoo.so[1] 是一个 32 位库,而 python想要 64 位版本。如何告诉 gcc/ctypes 生成 32 位库?

感谢您的任何反馈!

错误消息:

 File "foo.py", line 8, in <module>
    autofoo=cdll.LoadLibrary("./libfoo.so")
  File "/usr/lib/python2.6/ctypes/__init__.py", line 431, in LoadLibrary
    return self._dlltype(name)
  File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ./libfoo.so: wrong ELF class: ELFCLASS32

[1] 我使用 gcc -c -std=c99 -lm -D_GNU_SOURCE -Wall -pedantic -fopenmp -ofoo.o 编译 libfoo.so foo.c

after changing from a 32 to 64Bit Ubuntu installation my python+ctypes+c99 code is broken. I read so far, that the error ./libfoo.so: wrong ELF class: ELFCLASS32 means, that my libfoo.so[1] is a 32Bit library and that python wants a 64Bit version. How do I tell gcc/ctypes to generate the library as 32Bit?

Thanks for any feedback!

Error message:

 File "foo.py", line 8, in <module>
    autofoo=cdll.LoadLibrary("./libfoo.so")
  File "/usr/lib/python2.6/ctypes/__init__.py", line 431, in LoadLibrary
    return self._dlltype(name)
  File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ./libfoo.so: wrong ELF class: ELFCLASS32

[1] I compile libfoo.so with gcc -c -std=c99 -lm -D_GNU_SOURCE -Wall -pedantic -fopenmp -ofoo.o foo.c

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

北陌 2024-11-16 15:54:51

您需要将目标文件编译为 64 位且与位置无关,然后使用 64 位选项将目标文件链接到共享库。类似于:

gcc -c -fPIC -m64 -std=c99 -lm -D_GNU_SOURCE -Wall -pedantic -fopenmp -o foo.o foo.c
gcc -m64 -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o

这应该可以让你在我使用过的任何 gnu 工具链上获得 64 位库。如果您仍然收到错误,则您的工具链或 Python 中可能存在某些问题。

You need to compile the object file as 64 bit and position independent, then link the object file to the shared library with 64 bit options. Something like:

gcc -c -fPIC -m64 -std=c99 -lm -D_GNU_SOURCE -Wall -pedantic -fopenmp -o foo.o foo.c
gcc -m64 -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o

That should get you a 64 bit library on any gnu toolchain I have used. If you are still getting errors, something might be broken in your toolchain or Python.

吃不饱 2024-11-16 15:54:51

-m64 传递给 gcc 将告诉它构建 64 位代码(如果可能)。

Passing -m64 to gcc will tell it to build 64-bit code if possible.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文