Запуск X86-файлов на armv7

11

Я пытаюсь запустить принтер SNBC USB на Raspberry Pi2.

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

Я искал решения в Интернете, и люди предлагают использовать Qemu. Но это для полного x86, чтобы вооружить платформу. Есть ли способ легко преобразовать двоичный файл x86 в бинарный файл?

Кстати, является ли хорошей идеей преобразование двоичного файла x86 с использованием hexeditинструмента в эквивалентный armv7двоичный файл? ( opcodeпреобразование)

Если да, может кто-нибудь дать представление о том, как это сделать?

Nash
источник
Если у вас есть исходный код, вы можете «кросс-компилировать» для другой «целевой» арки.
BSD
superuser.com/questions/221549/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

13

Вы не можете легко преобразовать двоичный файл x86 в ARM. Если вы не можете получить исходный код или двоичный файл ARM от производителя и действительно хотите использовать принтер с Pi2, тогда подход Qemu является правильным в этом случае, хотя, скорее всего, он будет очень медленным , Qemu выполняет полную эмуляцию системы, но она также очень хорошо работает для эмуляции одного процесса.

Я предполагаю, что у вас есть какая-то производная Debian на вашем Pi2 (я не уверен, что это будет работать с 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этому должен работать напрямую (как указал Тоби Спейт ):

/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.
Мохаммед Нурельдин
@ Мохаммед, какой дистрибутив ты используешь?
Стивен Китт
Распбиан, выпуск 11.2016. и я хотел подражать i386
Мохаммед Нурельдин
Итак, ошибка, которую вы получаете, нормальная, Raspbian не предоставляет i386двоичные файлы. Это работает только с архитектурами, которые поддерживаются в используемом вами дистрибутиве.
Стивен Китт
Я должен был упомянуть, что попробовал это и с Rasbian, и с Ubuntu. Любое хорошее предложение, где я могу подражать i386 на хосте armhf?
Мухаммед Нурельдин
1

Спасибо за ваш подробный повтор.

Я использую Rasbian OS, и добавление архитектуры i386 завершается неудачно в raspbian во время обновления sudo apt-get. Могу ли я скачать пакет i386 отдельно для raspbian и установить? Если это так, вы можете поделиться ссылками на скачивание.

Могу ли я скопировать зависимые от фильтров файлы .so из i386 (Linux mint работает на x86) и вставить в соответствующие пути в raspbain и использовать Qemu для запуска фильтра?

Следующее является ldd echo фильтра:

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)

С уважением, Нэш

Nash
источник