Ausführen von X86-Binärdateien auf armv7

11

Ich versuche, einen SNBC-USB-Drucker auf Raspberry Pi2 auszuführen.

Dazu muss ich die Filter-Binärdatei des SNBC-USB-Druckers auf kopieren /usr/lib/cups/filter. Die Filter-Binärdatei wird jedoch mit einem x86-Prozessor kompiliert (der Hersteller hat kein Interesse daran, den Arm zu unterstützen), wo ich ihn verwende armv7. Ich weiß, dass es nicht funktionieren wird, aber aus Neugier habe ich es versucht und Tassen sagt /usr/lib/cups/filter/rasterorp3150 failed.

Ich habe im Internet nach Lösungen gesucht und die Leute schlagen vor, Qemu zu verwenden. Aber es ist für eine komplette x86-Plattform zu bewaffnen. Gibt es eine Möglichkeit, die x86-Binärdatei auf einfache und unkomplizierte Weise in eine Arm-Binärdatei umzuwandeln?

Ist es übrigens eine gute Idee , die x86-Binärdatei mit einem hexeditTool in eine äquivalente armv7Binärdatei zu konvertieren ? ( opcodeUmwandlung)

Wenn ja, kann jemand eine Idee geben, wie es geht?

Nash
quelle
Wenn Sie die Quelle haben, können Sie für einen anderen "Ziel" -Bogen "cross compile".
BSD
superuser.com/questions/221549/…
Ciro Santilli 事件 改造 改造 中心. 六四

Antworten:

13

Sie können eine x86- Binärdatei nicht einfach in ARM konvertieren . Wenn Sie den Quellcode oder eine ARM-Binärdatei vom Hersteller nicht erhalten können und den Drucker wirklich mit Ihrem Pi2 verwenden möchten, ist der Qemu-Ansatz in diesem Fall der richtige, obwohl er wahrscheinlich sehr langsam ist . Qemu führt eine vollständige Systememulation durch, funktioniert aber auch sehr gut für die Einzelprozessemulation.

Ich gehe davon aus, dass Sie eine Art Debian-Derivat auf Ihrem Pi2 haben (ich bin mir nicht sicher, ob dies mit Raspbian funktioniert) und dass die Binärdatei, für die Sie haben i386(wenn es 64-Bit ist, verwenden Sie amd64stattdessen). Beginnen Sie mit dem Hinzufügen i386als fremde Architektur:

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

Führen Sie dann ldddie Binärdatei aus und fügen Sie alle erforderlichen Bibliotheken hinzu. typischerweise

sudo apt-get install libc6:i386

und alles andere mit dem :i386hinzugefügten Suffix. Stellen Sie sicher, dass dadurch kein installiertes Paket entfernt wird. Hoffentlich ist alles, was Sie brauchen, Multiarch-fähig. (Sonst funktioniert der Rest nicht.)

Sobald Sie dies getan haben, installieren Sie es, qemu-user-staticfalls es noch nicht installiert ist (zusammen mit seiner binfmt-supportEmpfehlung). Dann können Sie qemu-i386-staticIhr Programm ausführen:

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

In der Tat sollte dank binfmt-supportihm direkt laufen (wie von Toby Speight hervorgehoben ):

/usr/lib/cups/filter/rasterorp3150

( binfmt-supportverwendet Qemu, um diese Arbeit transparent zu machen.)

Wenn Sie nicht verwenden möchten binfmt-support, entfernen Sie rasterorp3150sich:

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

und installieren Sie ein Skript mit

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

als /usr/lib/cups/filter/rasterorp3150.

Wenn Sie es vorziehen, können Sie für all dies eine Chroot einrichten. siehe debootstrapund seine --foreignOption (die Chroot kann so eingerichtet werden, dass Qemu automatisch verwendet wird).

Stephen Kitt
quelle
In der Zeit, in der diese Lösung nicht funktioniert, wird beim apt updateHinzufügen von i386 arch immer der Fehler 404 angezeigt.
Mohammed Noureldin
@Mohammed welche Distribution benutzt du?
Stephen Kitt
Raspbian, 11.2016 Veröffentlichung. und ich wollte i386
Mohammed Noureldin
OK, der Fehler, den Sie erhalten, ist normal. Raspbian bietet keine i386Binärdateien. Dies funktioniert nur mit Architekturen, die in der von Ihnen verwendeten Distribution unterstützt werden.
Stephen Kitt
Ich musste erwähnen, dass ich das sowohl mit Rasbian als auch mit Ubuntu versucht habe. Gibt es einen guten Disto-Vorschlag, bei dem ich i386 auf einem Armhf-Host emulieren kann?
Mohammed Noureldin
1

Vielen Dank für Ihre ausführliche Wiederholung.

Ich verwende Rasbian OS und das Hinzufügen der i386-Architektur schlägt in raspbian während des sudo apt-get-Updates fehl. Kann ich das i386-Paket separat für raspbian herunterladen und installieren?. Wenn ja, können Sie Links zum Herunterladen freigeben.

Kann ich die filterabhängigen .so-Dateien von i386 (Linux Mint unter x86) kopieren und in Raspbain in die entsprechenden Pfade einfügen und den Filter mit Qemu ausführen?

Es folgt das ldd-Echo des Filters:

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)

Rücksicht, Nash

Nash
quelle