在FreeBSD 13 AMD 64上,我有一些Linux二进制文件(在本例中为wkhtmltopdf),它们在标准shell中运行良好,但在Ruby exec()语句中无法运行。
1.我使用Linux二进制文件是因为FreeBSD构建是坏的。
1.据我所知,FreeBSD通常会检测ELF文件类型,并将所有必要的文件(如链接库)重定向到/compat/linux/...
1.当从exec()语句中运行时,似乎不会发生这种情况。
1.执行失败,并显示:/usr/local/bin/wkhtmltopdf: error while loading shared libraries: /usr/local/lib/libpng16.so.16: ELF file OS ABI invalid
我尝试从/compat/linux/bin/bash -c '/usr/local/bin/wkhtmltopdf'
启动命令失败
我怎样才能让Ruby在Linux模拟模式下执行这个二进制文件呢?
1条答案
按热度按时间a6b3iqyw1#
/usr/local/bin/wkhtmltopdf
已经启动,所以调用Ruby's exec()
是通过Linux ABI完成的,因为使用Ruby的exec()
调用是稍后通过syscall
到操作系统完成的。FreeBSD有一个加载器列表,而不是一个加载器。从FreeBSD的Angular 来看,它将幻数视为ELF二进制文件。ELF加载器查找一个专门的品牌,这是ELF映像中的注解部分,而SVR4 ELF二进制文件中没有。这是使用
brandelf
实用程序完成的。从文档中,我们知道:
FreeBSD的Linux模式会动态地重新设置查找的根目录。这实际上等同于联合文件系统挂载。首先,尝试在
/compat/linux/original-path
中查找文件。如果失败,则在/original-path
中完成查找因此,在您的例子中,您必须检查Ruby的环境是否没有覆盖这个机制,如
LD_LIBRARY_PATH
,正如您在后面的中告诉我的,通过在exec()
之前添加ENV['LD_LIBRARY_PATH'] = '/compat/linux/usr/lib64'
我强烈建议您去看FreeBSD的文档,这些文档真的值得一读:Chapter 11. Linux Binary Compatibility,更具体地说,11.5.5描述了整个过程。
最后,FreeeBSD的Linux兼容性真的很强大,一旦你了解它是如何工作的,我就可以玩
Linux's XPlane-11
模拟器,并使用一些复杂的软件,如VisualParadigm
,没有任何错误。