0

我正在尝试在 FreeBSD/PC-BSD 下使用一些 Linux 库,但我对 FreeBSD 上的 Linux 二进制兼容性如何工作有一些疑问。

我已经安装了此任务所需的内核模块,以及包含 Linux 库的附加 linux_base 包。

库本身是 libspotify,可以在这里下载(没有可用于 FreeBSD 的 libspotify 构建,因此必须使用 Linux): https ://developer.spotify.com/technologies/libspotify/#download

运行此 Python 代码剪切失败:

import ctypes
lib_path = './libspotify.so'
lib = ctypes.cdll.LoadLibrary(lib_path)

它说:

OSError: Shared object "libpthread.so.0" not found, required by "libspotify.so"

手册说 linux 二进制文件必须使用 标记brandelf,我这样做了: http ://www.freebsd.org/doc/handbook/linuxemu-lbc-install.html#idp74327472

但它还没有工作。

所以问题是: Linux 二进制兼容性仅适用于 Linux 可执行文件,还是也适用于在 FreeBSD 可执行文件中加载 Linux 库?

编辑:我知道这可能需要更改链接器配置,如对这个类似问题的回答所述,但由于该库将在 Python 脚本中加载,这似乎不是一个合适的方法。

提前致谢。

4

1 回答 1

3

所以问题是:Linux 二进制兼容性仅适用于 Linux 可执行文件,还是也适用于在 FreeBSD 可执行文件中加载 Linux 库?

简短的回答——它只适用于 linux 可执行文件。它不适用于从 FreeBSD 可执行文件加载 linux 共享库。

更长的版本:

您的问题是,当您从 FreeBSD 二进制文件加载应用程序时,它是FreeBSD的动态链接器来完成这项工作,它会尝试使用FreeBSD的库来解析符号,这不是您想要发生的。

作为比较,当你在 FreeBSD 上启动 Linux 二进制文件时,内核发现它是一个 linux 二进制文件(brandelf 在这里提供帮助)然后做两件事——用处理 linux 系统调用并将文件系统根目录重定向到 / 的那个替换进程的系统调用表。兼容/Linux。之后它会启动linux ld.so,然后加载linux动态库并解析其中的符号。

从 freebsd 应用程序直接使用 linux 共享对象在理论上是可能的,但在实践中很难做到。您需要弄清楚如何处理库可能进行的 linux 系统调用,处理它可能想要从linux共享库调用的函数,处理它可能想要打开假设linux文件系统布局的文件等。

更实用的解决方案是使用某种“代理”linux 二进制文件,它会加载您的 linux 共享库,并通过某种 IPC 与 freebsd 二进制文件通信,并代表 FreeBSD 应用程序执行对 linux 代码的调用。我相信这就是 Opera Web 浏览器在 FreeBSD 上运行 Linux 插件的方式。如果你很好奇,可以看看NSpluginwrapper,它做了类似的事情。

于 2014-01-08T21:16:34.077 回答