Executando binários do X86 no armv7

9

Estou tentando executar uma impressora USB SNBC no Raspberry Pi2.

Para isso eu preciso copiar o binário do filtro 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 suportar o suporte) onde eu uso armv7 . Eu sei que não vai funcionar, mas para uma curiosidade eu tentei e copos diz /usr/lib/cups/filter/rasterorp3150 failed .

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

A propósito, a conversão do binário x86 usando uma ferramenta hexedit para uma equivalente armv7 binary é uma boa idéia? ( opcode conversion)

Em caso afirmativo, alguém pode dar uma ideia de como fazer isso?

    
por Nash 14.07.2015 / 10:57

2 respostas

11

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

Eu estou supondo que você tenha algum tipo de derivado Debian no seu Pi2 (eu não tenho certeza se isso funcionará com o Raspbian), e que o binário que você tem é para i386 (se for 64-bit, use amd64 ). Comece adicionando i386 como uma arquitetura estrangeira:

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

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

sudo apt-get install libc6:i386

e mais alguma coisa com o sufixo :i386 adicionado. Certifique-se de que isso não remova nenhum pacote instalado; Espero que tudo que você precisa esteja habilitado para multiarch. (Caso contrário, o resto não funcionará.)

Uma vez feito isso, instale qemu-user-static se ele ainda não estiver instalado (junto com a recomendação binfmt-support ); então você pode usar qemu-i386-static para executar seu programa:

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

Na verdade, graças a binfmt-support , ele deve ser executado diretamente (como apontado por Toby Speight ) :

/usr/lib/cups/filter/rasterorp3150

( binfmt-support usará o Qemu para fazer isso funcionar de maneira transparente.)

Se você não quiser usar binfmt-support , mova rasterorp3150 :

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 debootstrap e sua opção --foreign (o chroot pode ser configurado para usar o Qemu automaticamente).

    
por 14.07.2015 / 12:10
1

Obrigado pela sua repetição detalhada.

Eu uso o Rasbian OS, e a adição da arquitetura i386 falha em raspbian durante     sudo apt-get update. Posso baixar o pacote i386 separadamente para raspbian e instalar ?. Em caso afirmativo, você pode compartilhar qualquer link para download.

Posso copiar os arquivos .so dependentes de filtros de i386 (Linux mint em execução em x86) e colar em caminhos apropriados em 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)

Em consideração, Nash

    
por 16.07.2015 / 10:10

Tags