Esecuzione di file binari X86 su armv7


11

Sto cercando di eseguire una stampante USB SNBC su Raspberry Pi2.

Per questo ho bisogno di copiare il binario del filtro della stampante USB SNBC su /usr/lib/cups/filter. Ma il binario del filtro viene compilato utilizzando un processore x86 (il produttore non ha interesse a supportare il braccio) dove lo uso armv7. So che non funzionerà, ma per curiosità ho provato e dice tazze /usr/lib/cups/filter/rasterorp3150 failed.

Ho cercato soluzioni su Internet e le persone suggeriscono di usare Qemu. Ma è per una piattaforma x86 completa da armare. C'è un modo per convertire il binario x86 in armare binario in modo semplice e senza complicazioni?

A proposito, è una buona idea convertire il binario x86 usando uno hexeditstrumento in un armv7binario equivalente ? ( opcodeconversione)

Se è così, qualcuno può dare qualche idea su come farlo?


Se hai il sorgente puoi "compilare in modo incrociato" per un arco "target" diverso.
bsd

Risposte:


13

Non è possibile convertire facilmente un binario x86 in ARM. Se non riesci a ottenere il codice sorgente o un binario ARM dal produttore e vuoi davvero usare la stampante con il tuo Pi2, in questo caso l'approccio Qemu è quello corretto, anche se probabilmente sarà molto lento . Qemu esegue l'emulazione di sistema completa ma funziona anche molto bene per l'emulazione a processo singolo.

Suppongo che tu abbia una sorta di derivata Debian sul tuo Pi2 (non sono sicuro che funzionerà con Raspbian) e che il binario che hai è i386(se è a 64 bit, usa amd64invece). Inizia aggiungendo i386come un'architettura straniera:

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

Quindi eseguire lddil file binario e aggiungere tutte le librerie richieste; tipicamente

sudo apt-get install libc6:i386

e qualsiasi altra cosa con il :i386suffisso aggiunto. Assicurarsi che ciò non rimuova alcun pacchetto installato; speriamo che tutto ciò di cui hai bisogno sia abilitato per multiarch. (Altrimenti il ​​resto non funzionerà.)

Una volta che lo hai fatto, installa qemu-user-staticse non è già installato (insieme alla sua binfmt-supportraccomandazione); quindi è possibile utilizzare qemu-i386-staticper eseguire il programma:

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

Infatti grazie ad binfmt-supportesso dovrebbe essere eseguito direttamente (come sottolineato da Toby Speight ):

/usr/lib/cups/filter/rasterorp3150

( binfmt-supportutilizzerà Qemu per farlo funzionare in modo trasparente.)

Se non vuoi usare binfmt-support, rasterorp3150allontanati:

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

e installa uno script contenente

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

come /usr/lib/cups/filter/rasterorp3150.

Se preferisci, puoi impostare un chroot per tutto questo; vedi debootstrape la sua --foreignopzione (il chroot può essere impostato per usare Qemu automaticamente).


Nel momento in cui questa soluzione non funziona, ottengo sempre l'errore 404 mentre lo faccio apt updatedopo aver aggiunto i386 arch.
Mohammed Noureldin,

@Mohammed quale distribuzione stai usando?
Stephen Kitt,

Raspbian, versione 11.2016. e volevo emulare i386
Mohammed Noureldin il

OK, quindi l'errore che stai ricevendo è normale, Raspbian non fornisce file i386binari. Funziona solo con architetture supportate nella distro che stai utilizzando.
Stephen Kitt,

Ho dovuto menzionare che l'ho provato con Rasbian e Ubuntu. Qualche suggerimento sulla disto in cui posso emulare i386 sull'host armhf?
Mohammed Noureldin,

1

Grazie per il tuo replay dettagliato.

Uso il sistema operativo Rasbian e l'aggiunta dell'architettura i386 non riesce in raspbian durante l'aggiornamento apt-get sudo. Posso scaricare il pacchetto i386 separatamente per raspbian e installarlo ?. In tal caso puoi condividere qualsiasi link da scaricare.

Posso copiare i file .so dipendenti dai filtri da i386 (Linux mint in esecuzione in x86) e incollare i percorsi appropriati in raspbain e usare Qemu per eseguire il filtro?

Di seguito sono riportati l'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)

Saluti, Nash

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.