web-dev-qa-db-ja.com

armv7でのX86バイナリの実行

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変換)

もしそうなら、誰でもそれを行う方法についていくつかのアイデアを与えることができますか?

11
Nash

x86バイナリをARMに簡単に変換することはできません。ソースコードを入手できない場合、またはARMバイナリを製造元から入手し、実際にPi2でプリンターを使用したい場合は、Qemuアプローチが適切です。 Qemuは完全なシステムエミュレーションを実行しますが、シングルプロセスエミュレーションでも非常にうまく機能します。

私はあなたがあなたのPi2にある種のDebian派生物を持っていると仮定しています(これがRaspbianで動作するかどうかはわかりません)、そしてあなたが持っているバイナリはi386用です(64ビットの場合は_を使用してください) [SOMECODE] _代わりに)。まず、AMD64を外部アーキテクチャとして追加します。

i386

次に、バイナリでlddを実行し、必要なライブラリを追加します。通常

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

その他、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を自動的に使用するように設定できます)。

14
Stephen Kitt

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

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)

よろしく、ナッシュ

1
Nash