`cdll.LoadLibrary("my.so")` 抛出 "no suitable image found." 但体系结构匹配,并且都是 64 位的。为什么?

`cdll.LoadLibrary("my.so")` throws "no suitable image found." but architectures match, and both for 64 bit. Why?

我有一个“共享对象”文件 my.so,我试图在 python 中加载它:

from ctypes import cdll
lib = cdll.LoadLibrary("my.so")

这失败了

OSError: dlopen(my.so, 6): no suitable image found.  Did find:
my.so: unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00
/path/to/.../my.so: unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00`

研究其他 SO 问题揭示:

Python ctypes not loading dynamic library on Mac OS X

该用户分享了“没有合适的图片”。错误。原因是处理器 运行ning python (x86_64) 的架构与其 .so 文件 (ARM) 的目标架构不匹配。确认这个问题的方法是运行,从命令行:

>file my.so

这输出 ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., stripped

Error "mach-o, but wrong architecture" after installing anaconda on mac 的重点是 32 位与 64 位。从 python 我可以看到 import platform;platform.architecture() 给出 ('64bit', '').

从我现在找不到的回复中可以看出,这种技术可能不可靠,而是使用最大 int 大小。 import sys; sys.maxsixe 给出 9223372036854775807 表示 64 位。

最后在a blog post on ELF binaries作者给出Python片段import os; os.uname()[4]给出机器架构。对我来说这个 returns x86_64.


总而言之,cdll 无法识别 ELF(“未知文件类型”)。环境和二进制文件都是 64 位的。这些架构也都匹配(并且是 x86_64)。

为什么这没有按预期工作?

编辑(归功于 Max): OS 运行ning python 是 macOS 10.15.7 Catalina.

MacOS不使用ELF共享对象格式,所以无法被MacOS动态链接器加载。由于它基于Mach微内核,因此继续使用Mach-O二进制格式,其共享库一般使用.dylib.

文件扩展名

一般来说,即使体系结构匹配并且它们都使用 ELF,您也不能在不同的操作系统上使用可执行 binaries/shared 对象。