Armv7'de X86 ikili dosyalarını çalıştırma


11

Raspberry Pi2'de bir SNBC USB yazıcı çalıştırmaya çalışıyorum.

Bunun için SNBC USB yazıcının filtre ikili dosyasını kopyalamam gerekiyor /usr/lib/cups/filter. Ancak filtre ikili, kullandığım yerde bir x86 işlemci (Üreticinin destek koluna ilgi duymaz) kullanılarak derlenir armv7. İşe yaramayacağını biliyorum ama merak için denedim ve bardaklar diyor /usr/lib/cups/filter/rasterorp3150 failed.

İnternette çözümler aradım ve insanlar Qemu kullanmayı önerdi. Ama tam bir x86 to arm platformu için. X86 ikilisini kolay bir şekilde karmaşık olmayan bir şekilde ikiliye dönüştürmenin bir yolu var mı?

Bu arada, bir hexeditaraç kullanarak x86 ikili dosyasını eşdeğer bir ikiliğe dönüştürmek armv7iyi bir fikir mi? ( opcodedönüşüm)

Eğer öyleyse, kimse nasıl yapılacağı hakkında fikir verebilir mi?


Kaynağa sahipseniz, farklı bir "hedef" kemer için "çapraz derleme" yapabilirsiniz.
bsd

Yanıtlar:


14

Bir x86 ikili dosyasını kolayca ARM'ye dönüştüremezsiniz . Kaynak kodu veya üreticiden bir ARM ikilisi alamıyorsanız ve yazıcıyı gerçekten Pi2'nizle kullanmak istiyorsanız, bu durumda Qemu yaklaşımı doğru olanıdır, ancak muhtemelen çok yavaş olacaktır. . Qemu tam sistem öykünmesi yapar, ancak tek işlem öykünmesi için de çok iyi çalışır.

Pi2'nizde bir çeşit Debian türevi olduğunu varsayıyorum (bunun Raspbian ile çalışacağından emin değilim) ve sahip olduğunuz ikili dosya i386(64 bit ise, amd64bunun yerine kullanın). i386Yabancı bir mimari olarak ekleyerek başlayın :

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

Sonra lddikili üzerinde çalıştırın ve gerekli kitaplıkları ekleyin; tipik

sudo apt-get install libc6:i386

ve :i386ek eklenmiş olan her şey . Bunun kurulu herhangi bir paketi kaldırmadığından emin olun; umarım ihtiyacınız olan her şey çok kanallıdır. (Aksi takdirde gerisi çalışmaz.)

Bunu yaptıktan sonra, qemu-user-staticönceden kurulmadıysa yükleyin ( binfmt-supportönerisiyle birlikte ); o zaman qemu-i386-staticprogramınızı çalıştırmak için kullanabilirsiniz :

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

Aslında sayesinde binfmt-supportdoğrudan çalışmalıdır ( Toby Speight tarafından belirtildiği gibi ):

/usr/lib/cups/filter/rasterorp3150

( binfmt-supportbu çalışmayı şeffaf bir şekilde yapmak için Qemu'yu kullanacaktır.)

Kullanmak istemiyorsanız binfmt-support, rasterorp3150uzaklaşın:

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

içeren bir komut dosyası yükleyin

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

olarak /usr/lib/cups/filter/rasterorp3150.

Tüm bunlar için bir chroot ayarlayabilirsiniz; bkz. debootstrapve --foreignseçeneği (chroot, Qemu'yu otomatik olarak kullanacak şekilde ayarlanabilir).


Bu çözüm işe yaramadığı zaman, apt updatei386 arch ekledikten sonra her zaman 404 hatası alıyorum .
Mohammed Noureldin

@Mohammed hangi dağıtımı kullanıyorsunuz?
Stephen Kitt

Raspbian, 11.2016 sürümü. ve ben i386 taklit etmek istediği
Mohammed Noureldin

Tamam, bu yüzden aldığınız hata normal, Raspbian i386ikili dosyalar sağlamaz . Bu yalnızca kullandığınız dağıtımda desteklenen mimarilerle çalışır.
Stephen Kitt

Bunu Rasbian ve Ubuntu ile denediğimi söylemeliydim. Armhf konağında i386'yı taklit edebileceğim iyi bir disto önerisi var mı?
Mohammed Noureldin

1

Ayrıntılı tekrarınız için teşekkürler.

Rasbian OS kullanıyorum ve sudo apt-get güncellemesi sırasında raspbian'da i386 mimarisinin eklenmesi başarısız oluyor. İ386 paketini raspbian için ayrı indirip kurabilir miyim? Eğer öyleyse indirmek için herhangi bir bağlantı paylaşabilirsiniz.

Filtreleri bağımlı .so dosyalarını i386'dan (x86'da çalışan Linux nane) kopyalayabilir ve raspbain'de uygun yollara yapıştırabilir ve filtreyi çalıştırmak için Qemu kullanabilir miyim?

Filtrenin ldd yankısı aşağıdadır:

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)

Saygılarımızla, Nash

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.