【问题标题】:Loading linux libraries inside FreeBSD program (Python script)在 FreeBSD 程序中加载 linux 库(Python 脚本)
【发布时间】:2014-01-08 20:29:16
【问题描述】:

我正在尝试在 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 库?

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

提前致谢。

【问题讨论】:

  • 据我所知,是第一个。 Linux 仿真层只能由 Linux 可执行文件调用。当然也有例外,比如nspluginwrapper

标签: python linux freebsd emulation libspotify


【解决方案1】:

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

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

加长版:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多