在armv7上运行X86二进制文件


11

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

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

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

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

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


如果您拥有源代码,则可以针对不同的“目标”目录进行“交叉编译”。
bsd

Answers:


14

您无法轻松地将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它应该直接运行(如Toby Speight所指出):

/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)。


暂时这种解决方案不起作用,apt update在添加i386 arch之后,我总是在执行过程中收到错误404 。
Mohammed Noureldin

@Mohammed您正在使用什么发行版?
史蒂芬·基特

Raspbian,11.2016版本。我想模仿i386
Mohammed Noureldin

好的,所以您遇到的错误是正常的,Raspbian不提供i386二进制文件。这仅适用于您使用的发行版中支持的体系结构。
斯蒂芬·基特

我不得不提到,我在Rasbian和Ubuntu上都尝试过。我可以在armhf主机上模拟i386的任何良好建议吗?
Mohammed Noureldin

1

感谢您的详细重播。

我使用Rasbian OS,在sudo apt-get更新期间无法在raspbian中添加i386体系结构。我可以单独为raspbian下载i386软件包并安装吗?如果是这样,您可以共享任何下载链接。

我可以从i386(运行于x86的Linux Mint)上复制依赖于过滤器的.so文件,并粘贴在raspbain中的相应路径中并使用Qemu运行过滤器吗?

以下是过滤器的ldd回声:

linux-gate.so.1 =>  (0xb779c000)
libcups.so.2 => /usr/lib/i386-linux-gnu/libcups.so.2 (0xb7716000)
libcupsimage.so.2 => /usr/lib/i386-linux-gnu/libcupsimage.so.2 (0xb770d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb755c000)
libgssapi_krb5.so.2 => /usr/lib/i386-linux-gnu/libgssapi_krb5.so.2 (0xb7517000)
libgnutls.so.26 => /usr/lib/i386-linux-gnu/libgnutls.so.26 (0xb7451000)
libavahi-common.so.3 => /usr/lib/i386-linux-gnu/libavahi-common.so.3 (0xb7443000)
libavahi-client.so.3 => /usr/lib/i386-linux-gnu/libavahi-client.so.3 (0xb7431000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7414000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb73fa000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb73b4000)
/lib/ld-linux.so.2 (0xb779d000)
libkrb5.so.3 => /usr/lib/i386-linux-gnu/libkrb5.so.3 (0xb72f6000)
libk5crypto.so.3 => /usr/lib/i386-linux-gnu/libk5crypto.so.3 (0xb72c6000)
libcom_err.so.2 => /lib/i386-linux-gnu/libcom_err.so.2 (0xb72c0000)
libkrb5support.so.0 => /usr/lib/i386-linux-gnu/libkrb5support.so.0 (0xb72b4000)
libgcrypt.so.11 => /lib/i386-linux-gnu/libgcrypt.so.11 (0xb722d000)
libtasn1.so.6 => /usr/lib/i386-linux-gnu/libtasn1.so.6 (0xb7219000)
libp11-kit.so.0 => /usr/lib/i386-linux-gnu/libp11-kit.so.0 (0xb71dd000)
libdbus-1.so.3 => /lib/i386-linux-gnu/libdbus-1.so.3 (0xb7191000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb718c000)
libkeyutils.so.1 => /lib/i386-linux-gnu/libkeyutils.so.1 (0xb7188000)
libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xb7170000)
libgpg-error.so.0 => /lib/i386-linux-gnu/libgpg-error.so.0 (0xb716b000)
libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xb7163000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb715a000)

纳什

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.