我正在尝试在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脚本中加载,这似乎不合适。
提前致谢。
答案 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做类似的事情。