在 armv7 上运行 X86 二进制文件

Nas*_*ash 12 arm x86 qemu

我正在尝试在 Raspberry Pi2 上运行 SNBC USB 打印机。

为此,我需要将 SNBC USB 打印机的过滤器二进制文件复制到/usr/lib/cups/filter. 但是过滤器二进制文件是使用 x86 处理器编译的(制造商没有兴趣支持 arm),而我使用armv7. 我知道这行不通,但出于好奇,我试过了,cups 说/usr/lib/cups/filter/rasterorp3150 failed

我在互联网上寻找解决方案,人们建议使用 Qemu。但它是针对完整的 x86 来武装平台的。有没有办法以简单不复杂的方式将 x86 二进制文件转换为 arm 二进制文件?

顺便说一句,使用hexedit工具将 x86 二进制文件转换为等效的armv7二进制文件是个好主意吗?(opcode转换)

如果是这样,任何人都可以就如何做到这一点提出一些想法吗?

Ste*_*itt 15

您无法轻松地将x86二进制文件转换为 ARM。如果您无法从制造商处获得源代码或 ARM 二进制文件,并且您确实希望将打印机与 Pi2 一起使用,那么 Qemu 方法在这种情况下是正确的方法,尽管它可能会很慢. Qemu 进行完整的系统仿真,但它也适用于单进程仿真。

我假设您的 Pi2 上有某种 Debian 衍生版本(不过我不确定这是否适用于 Raspbian),并且您拥有的二进制文件适用于i386(如果它是 64 位,请amd64改用)。首先添加i386一个外部架构:

sudo dpkg --add-architecture i386
sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

然后ldd在二进制文件上运行并添加任何所需的库;通常

sudo apt-get install libc6:i386
Run Code Online (Sandbox Code Playgroud)

以及:i386添加后缀的任何其他内容。确保这不会删除任何已安装的软件包;希望您需要的一切都支持多架构。(否则其余的将不起作用。)

完成后,qemu-user-static如果尚未安装,请安装(连同其binfmt-support建议);然后你可以qemu-i386-static用来运行你的程序:

qemu-i386-static /usr/lib/cups/filter/rasterorp3150
Run Code Online (Sandbox Code Playgroud)

事实上,由于binfmt-support它应该直接运行(正如Toby Speight所指出的):

/usr/lib/cups/filter/rasterorp3150
Run Code Online (Sandbox Code Playgroud)

binfmt-support将使用 Qemu 使这项工作透明化。)

如果您不想使用binfmt-support,请rasterorp3150移开:

sudo mv /usr/lib/cups/filter/rasterorp3150 /usr/lib/cups/filter/rasterorp3150.x86
Run Code Online (Sandbox Code Playgroud)

并安装一个包含脚本

#!/bin/sh
exec qemu-i386-static /usr/lib/cups/filter/rasterorp3150.x86 "$@"
Run Code Online (Sandbox Code Playgroud)

作为/usr/lib/cups/filter/rasterorp3150

如果您愿意,可以为所有这些设置一个 chroot;seedebootstrap及其--foreign选项(chroot 可以设置为自动使用 Qemu)。