Exécution de binaires X86 sur armv7

11

J'essaie d'exécuter une imprimante SNBC USB sur Raspberry Pi2.

Pour cela, je dois copier le filtre binaire de l'imprimante USB SNBC /usr/lib/cups/filter. Mais le filtre binaire est compilé à l'aide d'un processeur x86 (le constructeur n'a pas intérêt à supporter le bras) là où j'utilise armv7. Je sais que ça ne marchera pas mais pour une curiosité j'ai essayé et cups dit /usr/lib/cups/filter/rasterorp3150 failed.

J'ai cherché des solutions sur Internet et les gens suggèrent d'utiliser Qemu. Mais c'est pour une plate-forme x86 complète à armer. Existe-t-il un moyen de convertir le binaire x86 pour armer le binaire d'une manière simple et simple?

Soit dit en passant, la conversion du binaire x86 à l'aide d'un hexeditoutil en un armv7binaire équivalent est-elle une bonne idée? ( opcodeconversion)

Si oui, quelqu'un peut-il donner une idée de la façon de procéder?

Nash
la source
Si vous avez la source, vous pouvez «compiler de manière croisée» pour un arc «cible» différent.
bsd
superuser.com/questions/221549/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Réponses:

14

Vous ne pouvez pas facilement convertir un binaire x86 en ARM. Si vous ne pouvez pas obtenir le code source ou un binaire ARM du fabricant et que vous voulez vraiment utiliser l'imprimante avec votre Pi2, l'approche Qemu est la bonne dans ce cas, bien qu'elle soit probablement très lente. . Qemu fait une émulation complète du système, mais il fonctionne également très bien pour l'émulation de processus unique.

Je suppose que vous avez une sorte de dérivé Debian sur votre Pi2 (je ne suis pas sûr que cela fonctionnera avec Raspbian), et que le binaire que vous avez est destiné i386(s'il est 64 bits, utilisez-le à la amd64place). Commencez par ajouter i386une architecture étrangère:

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

Exécutez ensuite lddsur le binaire et ajoutez toutes les bibliothèques requises; typiquement

sudo apt-get install libc6:i386

et toute autre chose avec le :i386suffixe ajouté. Assurez-vous que cela ne supprime aucun package installé; nous espérons que tout ce dont vous avez besoin est compatible multiarchitecture. (Sinon, le reste ne fonctionnera pas.)

Une fois que vous avez fait cela, installez-le qemu-user-statics'il n'est pas déjà installé (avec sa binfmt-supportrecommandation); alors vous pouvez utiliser qemu-i386-staticpour exécuter votre programme:

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

En fait, grâce à binfmt-supportcela, il devrait fonctionner directement (comme l'a souligné Toby Speight ):

/usr/lib/cups/filter/rasterorp3150

( binfmt-supportutilisera Qemu pour rendre ce travail transparent.)

Si vous ne voulez pas utiliser binfmt-support, rasterorp3150éloignez-vous:

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

et installez un script contenant

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

comme /usr/lib/cups/filter/rasterorp3150.

Si vous préférez, vous pouvez configurer un chroot pour tout cela; voir debootstrapet son --foreignoption (le chroot peut être configuré pour utiliser Qemu automatiquement).

Stephen Kitt
la source
Dans le moment où cette solution ne fonctionne pas, j'obtiens toujours l'erreur 404 lors apt updatede l'ajout de l'arc i386.
Mohammed Noureldin
@Mohammed quelle distribution utilisez-vous?
Stephen Kitt
Raspbian, version 11.2016. et je voulais imiter i386
Mohammed Noureldin
OK, donc l'erreur que vous obtenez est normale, Raspbian ne fournit pas de i386binaires. Cela ne fonctionne qu'avec des architectures prises en charge dans la distribution que vous utilisez.
Stephen Kitt
Je dois mentionner que j'ai essayé cela avec Rasbian et Ubuntu. Toute bonne suggestion de disto où je peux émuler i386 sur un hôte armhf?
Mohammed Noureldin
1

Merci pour votre replay détaillé.

J'utilise Rasbian OS et l'ajout de l'architecture i386 échoue dans raspbian lors de la mise à jour sudo apt-get. Puis-je télécharger le package i386 séparément pour raspbian et l'installer?. Si oui, pouvez-vous partager les liens à télécharger.

Puis-je copier les fichiers .so dépendants des filtres à partir d'i386 (Linux mint fonctionnant en x86) et les coller dans les chemins appropriés dans raspbain et utiliser Qemu pour exécuter le filtre?

Voici l'écho ldd du filtre:

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)

Regarde, Nash

Nash
la source