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 2015

回答:


13

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-supportQemuを使用してこれを透過的に動作させます。)

を使用したくない場合は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を設定することができます。see debootstrapとその--foreignオプション(chrootはQemuを自動的に使用するように設定できます)。


当面はこのソリューションが機能しないため、apt updatei386アーチを追加した後は常にエラー404が発生します。
Mohammed Noureldin 2017年

@Mohammedどんなディストリビューションを使っていますか?
Stephen Kitt 2017年

Raspbian、11.2016リリース。そして、私はi386をエミュレートしたかった
Mohammed Noureldin 2017年

OK、それであなたが得るエラーは正常です、Raspbianはi386バイナリを提供していません。これは、使用しているディストリビューションでサポートされているアーキテクチャでのみ機能します。
Stephen Kitt 2017年

私はそれをRasbianとUbuntuの両方で試したことを言及しなければなりませんでした。armhfホストでi386をエミュレートできる良いdisto提案はありますか?
Mohammed Noureldin 2017年

1

詳細なリプレイをありがとう。

Rasbian OSを使用していますが、sudo apt-getの更新中に、raspbianでi386アーキテクチャの追加に失敗します。raspbian用のi386パッケージを個別にダウンロードしてインストールできますか?もしそうなら、ダウンロードするリンクを共有できますか。

フィルター依存の.soファイルをi386(x86で実行されているLinux mint)からコピーして、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)

よろしく、ナッシュ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.