Menjalankan binari X86 di armv7


11

Saya mencoba menjalankan printer USB SNBC di Raspberry Pi2.

Untuk itu saya perlu menyalin biner filter dari printer USB SNBC ke /usr/lib/cups/filter. Tapi filter biner dikompilasi menggunakan prosesor x86 (Produsen tidak memiliki minat untuk mendukung lengan) di mana seperti yang saya gunakan armv7. Saya tahu itu tidak akan berhasil tetapi untuk rasa ingin tahu saya mencoba dan cangkir mengatakan /usr/lib/cups/filter/rasterorp3150 failed.

Saya mencari solusi di internet dan orang-orang menyarankan untuk menggunakan Qemu. Tapi itu untuk platform x86 lengkap untuk dipersenjatai. Apakah ada cara untuk mengkonversi biner x86 ke binary arm dengan cara yang tidak rumit?

Omong-omong, apakah mengkonversi biner x86 menggunakan hexeditalat ke armv7biner setara adalah ide yang bagus? ( opcodekonversi)

Jika demikian, adakah yang bisa memberikan ide tentang cara melakukannya?


Jika Anda memiliki sumbernya, Anda dapat "kompilasi silang" untuk lengkungan "target" yang berbeda.
bsd

Jawaban:


13

Anda tidak dapat dengan mudah mengkonversi biner x86 ke ARM. Jika Anda tidak bisa mendapatkan kode sumber, atau binari ARM dari pabrikan, dan Anda benar-benar ingin menggunakan printer dengan Pi2 Anda, maka pendekatan Qemu adalah yang benar dalam kasus ini, meskipun kemungkinan akan sangat lambat . Qemu melakukan emulasi sistem penuh tetapi juga bekerja dengan sangat baik untuk emulasi proses tunggal.

Saya berasumsi Anda memiliki semacam turunan Debian pada Pi2 Anda (saya tidak yakin ini akan bekerja dengan Raspbian), dan bahwa biner yang Anda miliki adalah untuk i386(jika 64-bit, gunakan amd64saja). Mulai dengan menambahkan i386sebagai arsitektur asing:

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

Kemudian jalankan lddpada biner dan tambahkan perpustakaan yang dibutuhkan; khas

sudo apt-get install libc6:i386

dan apa pun dengan :i386akhiran yang ditambahkan. Pastikan ini tidak menghapus paket yang diinstal; semoga semua yang Anda butuhkan adalah multi-enabled-enabled. (Kalau tidak, sisanya tidak akan bekerja.)

Setelah Anda selesai melakukannya, instal qemu-user-staticjika belum diinstal (beserta binfmt-supportrekomendasinya); maka Anda dapat menggunakan qemu-i386-staticuntuk menjalankan program Anda:

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

Sebenarnya berkat binfmt-supportitu harus dijalankan langsung (seperti yang ditunjukkan oleh Toby Speight ):

/usr/lib/cups/filter/rasterorp3150

( binfmt-supportakan menggunakan Qemu untuk menjadikan pekerjaan ini transparan.)

Jika Anda tidak ingin menggunakan binfmt-support, pindah rasterorp3150:

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

dan instal skrip yang berisi

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

sebagai /usr/lib/cups/filter/rasterorp3150.

Jika mau, Anda dapat mengatur chroot untuk semua ini; lihat debootstrapdan --foreignopsinya (chroot dapat diatur untuk menggunakan Qemu secara otomatis).


Saat ini solusi ini tidak berfungsi, saya selalu mendapatkan kesalahan 404 saat melakukan apt updatesetelah menambahkan lengkungan i386.
Mohammed Noureldin

@Mohammed distribusi apa yang Anda gunakan?
Stephen Kitt

Raspbian, rilis 11.2016. dan saya ingin meniru i386
Mohammed Noureldin

OK, jadi kesalahan yang Anda dapatkan adalah normal, Raspbian tidak menyediakan i386binari. Ini hanya berfungsi dengan arsitektur yang didukung di distro yang Anda gunakan.
Stephen Kitt

Saya harus menyebutkan bahwa saya mencobanya dengan Rasbian dan Ubuntu. Adakah saran disto yang bagus di mana saya bisa meniru i386 pada host armhf?
Mohammed Noureldin

1

Terima kasih atas ulangan terperinci Anda.

Saya menggunakan Rasbian OS, dan menambahkan arsitektur i386 gagal di raspbian selama pembaruan sudo apt-get. Bisakah saya mengunduh paket i386 secara terpisah untuk raspbian dan menginstal ?. Jika demikian, Anda dapat membagikan tautan apa saja untuk diunduh.

Dapatkah saya menyalin filter .so file dari i386 (Linux mint berjalan di x86) dan menempelkan di jalur yang sesuai di raspbain dan menggunakan Qemu untuk menjalankan filter?

Berikut ini adalah gema ldd dari filter:

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)

Salam, Nash

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.