在FreeBSD程序中加载linux库(Python脚本)

时间:2014-01-08 20:29:17

标签: python linux freebsd emulation libspotify

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

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

但它还不起作用。

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

编辑:我知道这可能需要更改this similar question答案中所述的链接器配置,但由于该库将在Python脚本中加载,这似乎不合适。

提前致谢。

1 个答案:

答案 0 :(得分:3)

  

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

简短回答 - 它仅适用于Linux可执行文件。它是用于从FreeBSD可执行文件加载Linux共享库。

更长的版本:

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

为了比较,当你在FreeBSD上启动Linux二进制文件时,内核会发现它是一个linux二进制文件(brandelf在这里帮助)然后做两件事 - 重放进程'syscall表与一个将处理linux系统调用并重定向文件系统的表root到/ compat / linux。之后它启动 linux ld.so,然后加载 linux 动态库并解析其中的符号。

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

更实用的解决方案是拥有某种“代理”linux二进制文件,它将加载你的linux共享库,并通过某种IPC与freebsd二进制文件进行通信,并代表FreeBSD app执行linux代码调用。我相信这是Opera网页浏览器在FreeBSD上运行Linux插件的方式。如果你很好奇,请看看NSpluginwrapper做类似的事情。