Executando binários X86 no armv7

11

Estou tentando executar uma impressora SNBC USB no Raspberry Pi2.

Para isso, preciso copiar o filtro binário da impressora USB SNBC para /usr/lib/cups/filter. Mas o binário do filtro é compilado usando um processador x86 (o fabricante não tem interesse em apoiar o braço) onde eu uso armv7. Eu sei que não vai funcionar, mas por uma curiosidade eu tentei e diz copos /usr/lib/cups/filter/rasterorp3150 failed.

Procurei soluções na internet e as pessoas sugerem o uso do Qemu. Mas é para um x86 completo armar a plataforma. Existe uma maneira de converter o binário x86 para armar o binário de uma maneira fácil e sem complicações?

A propósito, converter o binário x86 usando uma hexeditferramenta em um armv7binário equivalente é uma boa idéia? ( opcodeconversão)

Se sim, alguém pode dar uma idéia de como fazê-lo?

Nash
fonte
Se você possui a fonte, pode "compilar de forma cruzada" para um arco "alvo" diferente.
BSD
superuser.com/questions/221549/…
Ciro Santilli escreveu:

Respostas:

13

Você não pode converter facilmente um binário x86 para ARM. Se você não pode obter o código-fonte ou um binário ARM do fabricante e realmente deseja usar a impressora com o Pi2, a abordagem Qemu é a correta nesse caso, embora provavelmente seja muito lenta . O Qemu faz emulação completa do sistema, mas também funciona muito bem para emulação de processo único.

Estou assumindo que você tenha algum tipo de derivado do Debian no seu Pi2 (embora não tenha certeza de que isso funcione com o Raspbian), e que o binário que você possui é i386(se for de 64 bits, use amd64). Comece adicionando i386como uma arquitetura estrangeira:

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

Em seguida, execute lddo binário e adicione as bibliotecas necessárias; tipicamente

sudo apt-get install libc6:i386

e qualquer outra coisa com o :i386sufixo adicionado. Verifique se isso não remove nenhum pacote instalado; espero que tudo o que você precise seja habilitado para multiarch. (Caso contrário, o resto não funcionará.)

Depois de fazer isso, instale qemu-user-staticse ainda não estiver instalado (junto com sua binfmt-supportrecomendação); então você pode usar qemu-i386-staticpara executar seu programa:

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

De fato, graças a binfmt-supportele deve ser executado diretamente (como apontado por Toby Speight ):

/usr/lib/cups/filter/rasterorp3150

( binfmt-supportusará o Qemu para fazer isso funcionar de forma transparente.)

Se você não quiser usar binfmt-support, afaste- rasterorp3150se:

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

e instale um script contendo

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

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

Se preferir, você pode configurar um chroot para tudo isso; veja debootstrape sua --foreignopção (o chroot pode ser configurado para usar o Qemu automaticamente).

Stephen Kitt
fonte
Enquanto essa solução não funciona, sempre recebo o erro 404 ao fazer isso apt updatedepois de adicionar o arco i386.
Mohammed Noureldin
@Mohammed que distribuição você está usando?
Stephen Kitt
Raspbian, versão de 11.2016. e eu queria emular i386
Mohammed Noureldin
OK, então o erro que você está recebendo é normal, o Raspbian não fornece i386binários. Isso funciona apenas com arquiteturas suportadas na distribuição que você está usando.
Stephen Kitt
Eu tinha que mencionar que tentei isso com o Rasbian e o Ubuntu. Alguma sugestão boa disso onde eu possa emular o i386 no host armhf?
Mohammed Noureldin
1

Obrigado pelo seu replay detalhado.

Eu uso o Rasbian OS e a adição da arquitetura i386 falha no raspbian durante a atualização do sudo apt-get. Posso baixar o pacote i386 separadamente para raspbian e instalar? Se assim for, você pode compartilhar todos os links para download.

Posso copiar os arquivos .so dependentes de filtros do i386 (Linux mint executando em x86) e colar nos caminhos apropriados no raspbain e usar o Qemu para executar o filtro?

A seguir, o eco ldd do 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)

Regard, Nash

Nash
fonte