我正在尝试在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库?
EDIT:我知道这可能需要更改链接器配置,正如这个类似问题的答案所述,但由于库将在Python脚本中加载,因此这似乎不是一种合适的方法。
提前谢谢。
所以问题是:Linux二进制兼容性仅适用于Linux可执行文件或也适用于在内部加载Linux库FreeBSD可执行文件?
简短的回答——它只适用于linux可执行文件。从FreeBSD可执行文件加载linux共享库是不可行的。
更长版本:
你的问题是,当你从FreeBSD二进制文件加载应用程序时,是FreeBSD的动态链接器完成了这项工作,它将尝试使用FreeBSD's库来解析符号,这不是你想要的。
相比之下,当您在FreeBSD上启动Linux二进制文件时,内核会发现它是一个Linux二进制文件(这里brandelf有帮助),然后做两件事——用处理Linux系统调用并将文件系统根重定向到/compat/Linux的表替换进程的系统调用表。之后,它启动linuxld.so,然后加载linux动态库并解析它们之间的符号。
从freebsd应用程序直接使用linux共享对象在理论上是可能的,但在实践中很难做到。您需要弄清楚如何处理库可能进行的linux系统调用,处理它可能想从linux共享库调用的函数,处理它在假设linux文件系统布局的情况下可能想打开的文件,等等。
一个更实用的解决方案是使用某种"代理"linux二进制文件,它将加载您的linux共享库,并通过某种IPC与freebsd二进制文件通信,并代表freebsd应用程序执行对linux代码的调用。我相信这就是opera web浏览器在FreeBSD上运行Linux插件的方式。如果你很好奇,可以看看NSpluginwrapper,它做了类似的事情。