如何在FreeBSD上从ruby exec()中启动Linux二进制文件?

iyfamqjs  于 2023-03-17  发布在  Ruby
关注(0)|答案(1)|浏览(103)

在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模拟模式下执行这个二进制文件呢?

a6b3iqyw

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,没有任何错误。

相关问题