Запуск бінарних файлів X86 на armv7


11

Я намагаюся запустити принтер SNBC USB на Raspberry Pi2.

Для цього мені потрібно скопіювати бінарний фільтр USB-принтера SNBC на /usr/lib/cups/filter. Але двійковий фільтр компілюється за допомогою процесора x86 (у виробника немає інтересу підтримувати руку), де я використовую armv7. Я знаю, що це не вийде, але для цікавості я спробував, і чашки кажуть /usr/lib/cups/filter/rasterorp3150 failed.

Я шукав рішення в Інтернеті, і люди пропонують використовувати Qemu. Але це для повної платформи x86 для озброєння. Чи є спосіб перетворити бінарний x86 в озброєння бінарним простим простим нескладним способом?

До речі, чи перетворення двійкового файлу x86 за допомогою hexeditінструменту в еквівалентний armv7бінарний є гарною ідеєю? ( opcodeконверсія)

Якщо так, чи може хтось дати якусь ідею, як це зробити?


Якщо у вас є джерело, ви можете "перехрестити компіляцію" для іншої "цільової" арки.
bsd

Відповіді:


14

Ви не можете легко конвертувати двійковий x86 в ARM. Якщо ви не можете отримати вихідний код або двійковий файл ARM від виробника, і ви дійсно хочете використовувати принтер разом із Pi2, тоді підхід Qemu є правильним у цьому випадку, хоча, ймовірно, це буде дуже повільно . Qemu робить повну емуляцію системи, але вона також дуже добре працює для емуляції одного процесу.

Я припускаю, що у вас на Pi2 є якась похідна Debian (я не впевнений, що це буде працювати з Raspbian), і те, що у вас є бінарне i386(якщо це 64-бітове, використовуйте amd64замість цього). Почніть з додавання i386як зарубіжної архітектури:

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

Потім запустіть lddбінарний файл і додайте необхідні бібліотеки; як правило

sudo apt-get install libc6:i386

і що-небудь ще із :i386доданим суфіксом. Переконайтеся, що це не видаляє встановлений пакет; сподіваємось, що все, що вам потрібно, підтримується мультиархом. (Інакше решта не працюватиме.)

Щойно ви зробите це, встановіть, qemu-user-staticякщо він ще не встановлений (разом з його binfmt-supportрекомендацією); тоді ви можете використовувати qemu-i386-staticдля запуску програми:

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

Насправді завдяки цьому binfmt-supportвін повинен працювати безпосередньо (на що вказував Toby Speight ):

/usr/lib/cups/filter/rasterorp3150

( binfmt-supportбуде використовувати Qemu для прозорості цієї роботи.)

Якщо ви не хочете користуватися binfmt-support, відсуньтесь rasterorp3150:

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

і встановити скрипт, що містить

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

як /usr/lib/cups/filter/rasterorp3150.

Якщо ви хочете, ви можете встановити chroot для всього цього; див. debootstrapта її --foreignваріант (chroot може бути налаштований так, щоб автоматично використовувати Qemu).


У той час, коли це рішення не працює, я завжди отримую помилку 404 під час apt updateдодавання арки i386.
Мохаммед Нурелдін

@Mohammed, який дистрибутив ти використовуєш?
Стівен Кітт

Raspbian, 11.2016 року випуску. і я хотів наслідувати i386
Мохаммед Нурелдін

Гаразд, тому помилка, яку ви отримуєте, є звичайною, Raspbian не надає i386двійкові файли. Це працює лише з архітектурами, які підтримуються в дистрибутиві, який ви використовуєте.
Стівен Кітт

Я мав зазначити, що я спробував це як з Rasbian, так і з Ubuntu. Будь-яка гарна пропозиція, де я можу імітувати i386 на хості armhf?
Мухаммед Нурелдін

1

Дякуємо за детальне повторення.

Я використовую Rasbian OS, і додавання архітектури i386 не вдається в raspbian під час оновлення sudo apt-get. Чи можу я завантажити пакет i386 окремо для raspbian та встановити ?. Якщо так, ви можете поділитися будь-якими посиланнями для завантаження.

Чи можу я скопіювати фільтри залежно .so файлів з i386 (Linux-монетний двір працює на x86) і вставити у відповідні контури в raspbain і використовувати Qemu для запуску фільтра?

Далі наведено ldd-відлуння фільтра:

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)

З повагою, Наш

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.