Exécution des binarys X86 sur armv7

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

Pour cela j'ai besoin de copyr le binary de filter de l'imprimante USB SNBC dans /usr/lib/cups/filter . Mais le filter binary est compilé en utilisant un processeur x86 (le fabricant n'a pas intérêt à soutenir le arm) où j'utilise armv7 . Je sais que ça ne marchera pas, mais pour une curiosité j'ai essayé et tasses 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. Yat-il un moyen de convertir le binary x86 pour armer binary d'une manière simple et sans complication?

En passant, est-ce que convertir le binary x86 en utilisant un outil hexedit à un binary armv7 équivalent armv7 une bonne idée? (conversion d' opcode )

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

Vous ne pouvez pas facilement convertir un binary x86 en ARM. Si vous ne pouvez pas get le code source ou un binary ARM du fabricant et que vous voulez réellement utiliser l'imprimante avec votre Pi2, alors l'approche Qemu est la bonne dans ce cas, mais elle sera probablement très lente . Qemu fait l'émulation complète du système mais il fonctionne aussi très bien pour l'émulation d'un seul process.

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 binary que vous avez est pour i386 (si c'est 64 bits, utilisez amd64 place). Commencez par append i386 comme architecture étrangère:

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

Exécutez ensuite ldd sur le binary et ajoutez les bibliothèques requirejses; typiquement

 sudo apt-get install libc6:i386 

et n'importe quoi d'autre avec le suffixe :i386 ajouté. Assurez-vous que cela ne supprime aucun package installé; j'espère que tout ce dont vous avez besoin est multi-compatible. (Sinon, le rest ne fonctionnera pas.)

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

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

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

 /usr/lib/cups/filter/rasterorp3150 

( binfmt-support utilisera Qemu pour que cela fonctionne de manière transparente.)

Si vous ne souhaitez pas utiliser binfmt-support , déplacez rasterorp3150 :

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

et installer 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 mettre en place un chroot pour tout cela; voir debootstrap et son option --foreign (le chroot peut être configuré pour utiliser Qemu automatiquement).

Merci pour votre rediffusion détaillée.

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

Puis-je copyr les files .so dépendants de i386 (Linux Mint en cours d'exécution en x86) et coller dans les paths appropriés dans raspbain et utiliser Qemu pour exécuter le filter?

Voici l'écho ldd du filter:

 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) 

Regard, Nash