在armv7上运行X86二进制文件

在armv7上运行X86二进制文件

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

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

我在互联网上寻找解决方案,人们建议使用 Qemu。但它是针对完整的x86到arm平台。有没有一种方法可以轻松地将 x86 二进制文件转换为 arm 二进制文件?

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

如果是这样,任何人都可以提供一些关于如何做到这一点的想法吗?

答案1

你不能轻易地转换x86二进制到 ARM。如果您无法从制造商处获得源代码或 ARM 二进制文件,并且您确实希望将打印机与 Pi2 一起使用,那么在这种情况下 Qemu 方法是正确的方法,尽管它可能会非常慢。 Qemu 可以进行完整的系统模拟,但它对于单进程模拟也非常有效。

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

sudo dpkg --add-architecture i386
sudo apt-get update

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

sudo apt-get install libc6:i386

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

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

qemu-i386-static /usr/lib/cups/filter/rasterorp3150

事实上,由于binfmt-support它应该直接运行(正如所指出的托比·斯佩特):

/usr/lib/cups/filter/rasterorp3150

binfmt-support将使用 Qemu 来透明地完成这项工作。)

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

sudo mv /usr/lib/cups/filter/rasterorp3150 /usr/lib/cups/filter/rasterorp3150.x86

并安装一个包含以下内容的脚本

#!/bin/sh
exec qemu-i386-static /usr/lib/cups/filter/rasterorp3150.x86 "$@"

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

如果你愿意,你可以为这一切设置一个 chroot;请参阅debootstrap及其--foreign选项(可以将 chroot 设置为自动使用 Qemu)。

相关内容