我正在尝试在 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)。