Ejecutando binarios X86 en armv7

11

Estoy tratando de ejecutar una impresora USB SNBC en Raspberry Pi2.

Para eso necesito copiar el filtro binario de la impresora USB SNBC /usr/lib/cups/filter. Pero el filtro binario se compila usando un procesador x86 (el fabricante no tiene interés en apoyar el brazo) donde lo uso armv7. Sé que no funcionará, pero por curiosidad lo intenté y dice cups /usr/lib/cups/filter/rasterorp3150 failed.

Busqué soluciones en Internet y la gente sugiere usar Qemu. Pero es para una plataforma x86 completa para armar. ¿Hay alguna manera de convertir el binario x86 en binario de armado de una manera fácil y sin complicaciones?

Por cierto, ¿es una buena idea convertir el binario x86 usando una hexeditherramienta a un armv7binario equivalente ? ( opcodeconversión)

Si es así, ¿alguien puede dar alguna idea sobre cómo hacerlo?

Nash
fuente
Si tiene la fuente, puede "realizar una compilación cruzada" para un arco "objetivo" diferente.
bsd
superuser.com/questions/221549/...
Ciro Santilli冠状病毒审查六四事件法轮功

Respuestas:

13

No puede convertir fácilmente un binario x86 a ARM. Si no puede obtener el código fuente, o un binario ARM del fabricante, y realmente desea utilizar la impresora con su Pi2, entonces el enfoque de Qemu es el correcto en este caso, aunque probablemente sea muy lento . Qemu realiza la emulación completa del sistema, pero también funciona muy bien para la emulación de un solo proceso.

Supongo que tiene algún tipo de derivado de Debian en su Pi2 (aunque no estoy seguro de que esto funcione con Raspbian), y que el binario que tiene es para i386(si es de 64 bits, use amd64en su lugar). Comience agregando i386como arquitectura extranjera:

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

Luego, ejecute ldden el binario y agregue las bibliotecas necesarias; típicamente

sudo apt-get install libc6:i386

y cualquier otra cosa con el :i386sufijo agregado. Asegúrese de que esto no elimine ningún paquete instalado; Esperemos que todo lo que necesita esté habilitado para multiarch. (De lo contrario, el resto no funcionará).

Una vez que haya hecho eso, instálelo qemu-user-staticsi aún no está instalado (junto con su binfmt-supportrecomendación); entonces puedes usar qemu-i386-staticpara ejecutar tu programa:

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

De hecho, gracias a binfmt-supportél debería ejecutarse directamente (como lo señaló Toby Speight ):

/usr/lib/cups/filter/rasterorp3150

( binfmt-supportutilizará Qemu para que esto funcione de manera transparente).

Si no quieres usar binfmt-support, rasterorp3150aléjate:

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

e instalar un script que contenga

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

como /usr/lib/cups/filter/rasterorp3150.

Si prefieres puedes configurar un chroot para todo esto; see debootstrapy su --foreignopción (el chroot se puede configurar para usar Qemu automáticamente).

Stephen Kitt
fuente
En el momento en que esta solución no funciona, siempre obtengo el error 404 mientras lo hago apt updatedespués de agregar i386 arch.
Mohammed Noureldin
@ Mohammed, ¿qué distribución estás usando?
Stephen Kitt
Raspbian, lanzamiento 11.2016. y quería emular i386
Mohammed Noureldin
OK, entonces el error que está recibiendo es normal, Raspbian no proporciona i386binarios. Esto solo funciona con arquitecturas compatibles con la distribución que está utilizando.
Stephen Kitt el
Tenía que mencionar que lo intenté con Rasbian y Ubuntu. ¿Alguna buena sugerencia de disto donde pueda emular i386 en el host armhf?
Mohammed Noureldin
1

Gracias por tu repetición detallada.

Uso el sistema operativo Rasbian, y la adición de la arquitectura i386 falla en raspbian durante sudo apt-get update. ¿Puedo descargar el paquete i386 por separado para raspbian e instalarlo? Si es así, ¿puedes compartir algún enlace para descargar?

¿Puedo copiar los archivos .so dependientes de filtros de i386 (Linux mint ejecutándose en x86) y pegarlos en las rutas apropiadas en raspbain y usar Qemu para ejecutar el filtro?

Los siguientes son el eco ldd del filtro:

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)

Respeto, Nash

Nash
fuente