armv7에서 X86 바이너리 실행


11

Raspberry Pi2에서 SNBC USB 프린터를 실행하려고합니다.

이를 위해 SNBC USB 프린터의 필터 바이너리를에 복사해야합니다 /usr/lib/cups/filter. 그러나 필터 바이너리는 내가 사용하는 x86 프로세서 (제조업체는 팔을 지원하는 데 관심이 없음)를 사용하여 컴파일됩니다 armv7. 나는 그것이 효과가 없을 것이라는 것을 알고 있지만 호기심을 위해 시도하고 컵은 말합니다 /usr/lib/cups/filter/rasterorp3150 failed.

인터넷에서 솔루션을 찾고 사람들은 Qemu를 사용하도록 제안합니다. 그러나 완전한 x86-to-arm 플랫폼입니다. x86 바이너리를 쉬운 방법으로 arm 바이너리로 변환하는 방법이 있습니까?

그건 그렇고, hexedit도구를 사용하여 x86 바이너리를 동등한 armv7바이너리로 변환하는 것이 좋은 생각입니까? ( opcode전환)

그렇다면 누구나 그것을하는 방법에 대한 아이디어를 줄 수 있습니까?


소스가 있으면 다른 "대상"아치에 대해 "크로스 컴파일"할 수 있습니다.
bsd

답변:


14

x86 바이너리를 ARM으로 쉽게 변환 할 수 없습니다 . 소스 코드 또는 제조업체에서 ARM 바이너리를 얻을 수없고 실제로 Pi2와 함께 프린터를 사용하려는 경우 Qemu 접근 방식이이 경우에는 올바른 방법이지만 매우 느릴 수 있습니다. . Qemu는 전체 시스템 에뮬레이션을 수행하지만 단일 프로세스 에뮬레이션에도 매우 효과적입니다.

나는 (I 확신이 Raspbian하지만 작동합니다 아니에요) 당신이 당신의 PI2에 데비안 유도체의 일종을 가지고 가정, 그리고 당신이 가지고있는 바이너리가 있음을 해요 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를 자동으로 사용하도록 설정 될 수 있음).


현재이 솔루션이 작동하지 않으면 apt updatei386 아치를 추가 한 후 항상 오류 404가 발생 합니다.
Mohammed Noureldin

@Mohammed 어떤 배포를 사용하고 있습니까?
Stephen Kitt 2012 년

Raspbian, 11.2016 릴리스. 그리고 나는 i386을 모방하고 싶었다
Mohammed Noureldin

좋아, 그래서 당신이 얻는 오류는 정상적인 것입니다, Raspbian은 i386바이너리를 제공하지 않습니다 . 이것은 사용중인 배포판에서 지원되는 아키텍처에서만 작동합니다.
Stephen Kitt

나는 Rasbian과 Ubuntu에서 모두 시도했다고 언급해야했습니다. armhf 호스트에서 i386을 에뮬레이트 할 수있는 좋은 제안이 있습니까?
Mohammed Noureldin

1

자세한 재생에 감사드립니다.

Rasbian OS를 사용하고 있으며 sudo apt-get 업데이트 중에 ra386에서 i386 아키텍처 추가가 실패합니다. raspbian 및 설치용으로 i386 패키지를 별도로 다운로드 할 수 있습니까? 그렇다면 다운로드 할 링크를 공유 할 수 있습니다.

i386 (x86에서 실행되는 Linux 민트)에서 필터 종속 .so 파일을 복사하고 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)

내쉬, 내쉬

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.