Uruchamianie plików binarnych X86 na armv7

11

Próbuję uruchomić drukarkę USB SNBC na Raspberry Pi2.

W tym celu muszę skopiować plik binarny filtru drukarki USB SNBC /usr/lib/cups/filter. Ale plik binarny filtru jest kompilowany przy użyciu procesora x86 (producent nie jest zainteresowany obsługą ramienia) tam, gdzie używam armv7. Wiem, że to nie zadziała, ale z ciekawości próbowałem i miseczki mówią /usr/lib/cups/filter/rasterorp3150 failed.

Szukałem rozwiązań w Internecie i ludzie sugerują używanie Qemu. Ale jest to kompletna platforma do uzbrojenia x86. Czy istnieje sposób na konwersję pliku binarnego x86 na plik binarny w łatwy i nieskomplikowany sposób?

Nawiasem mówiąc, czy konwersja pliku binarnego x86 za pomocą hexeditnarzędzia na równoważny armv7plik binarny to dobry pomysł? ( opcodekonwersja)

Jeśli tak, to czy ktoś może dać pomysł, jak to zrobić?

Nash
źródło
Jeśli masz źródło, możesz „skompilować” dla innego „docelowego” łuku.
bsd
superuser.com/questions/221549/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Odpowiedzi:

14

Nie można łatwo przekonwertować pliku binarnego x86 na ARM. Jeśli nie możesz uzyskać kodu źródłowego lub pliku binarnego ARM od producenta i naprawdę chcesz używać drukarki z Pi2, to podejście Qemu jest w tym przypadku prawidłowe, chociaż prawdopodobnie będzie bardzo wolne . Qemu wykonuje pełną emulację systemu, ale działa również bardzo dobrze w przypadku emulacji pojedynczego procesu.

Zakładam, że masz jakąś pochodną Debiana na swoim Pi2 (nie jestem pewien, czy to zadziała z Raspbianem), i że masz do tego plik binarny i386(jeśli jest 64-bitowy, użyj amd64zamiast tego). Zacznij od dodania i386jako architektury obcej:

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

Następnie uruchom lddplik binarny i dodaj wymagane biblioteki; zazwyczaj

sudo apt-get install libc6:i386

i wszystko inne z :i386dodanym przyrostkiem. Upewnij się, że nie usunie to żadnego zainstalowanego pakietu; miejmy nadzieję, że wszystko, czego potrzebujesz, obsługuje wiele trybów. (W przeciwnym razie reszta nie będzie działać.)

Gdy to zrobisz, zainstaluj, qemu-user-staticjeśli nie jest jeszcze zainstalowany (wraz z binfmt-supportzaleceniami); następnie możesz użyć qemu-i386-staticdo uruchomienia programu:

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

W rzeczywistości dzięki binfmt-supporttemu powinien działać bezpośrednio (jak wskazał Toby Speight ):

/usr/lib/cups/filter/rasterorp3150

( binfmt-supportużyje Qemu, aby to działało transparentnie).

Jeśli nie chcesz używać binfmt-support, rasterorp3150odejdź:

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

i zainstaluj skrypt zawierający

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

jak /usr/lib/cups/filter/rasterorp3150.

Jeśli wolisz, możesz skonfigurować chroot do tego wszystkiego; see debootstrapi jego --foreignopcja (chroot można skonfigurować do automatycznego korzystania z Qemu).

Stephen Kitt
źródło
W chwili obecnej to rozwiązanie nie działa, zawsze pojawia się błąd 404 podczas apt updatedodawania łuku i386.
Mohammed Noureldin
@Mohammed, jakiej dystrybucji używasz?
Stephen Kitt
Wersja Raspbian, 11.2016. i chciałem emulować i386
Mohammed Noureldin
OK, więc otrzymywany błąd jest normalny, Raspbian nie zapewnia i386plików binarnych. Działa to tylko z architekturami obsługiwanymi w używanej dystrybucji.
Stephen Kitt
Musiałem wspomnieć, że próbowałem tego z Rasbian i Ubuntu. Jakiś dobry pomysł na dystrybucję gdzie mogę emulować i386 na hoście armhf?
Mohammed Noureldin
1

Dziękujemy za szczegółową powtórkę.

Używam systemu operacyjnego Rasbian, a dodawanie architektury i386 kończy się niepowodzeniem w języku raspbian podczas aktualizacji sudo apt-get. Czy mogę pobrać pakiet i386 osobno dla Raspbian i zainstalować ?. Jeśli tak, możesz udostępnić linki do pobrania.

Czy mogę skopiować zależne od filtrów pliki .so z i386 (Linux mint w wersji x86) i wkleić odpowiednie ścieżki w raspbain i użyć Qemu do uruchomienia filtra?

Poniżej znajduje się echo ldd filtra:

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)

Pozdrawiam, Nash

Nash
źródło