การเรียกใช้ไบนารี X86 บน armv7


11

ฉันพยายามเรียกใช้เครื่องพิมพ์ SNBC USB บน Raspberry Pi2

เพื่อที่ฉันต้องคัดลอกไบนารีตัวกรองของเครื่องพิมพ์ USB SNBC /usr/lib/cups/filterไป แต่ไบนารีตัวกรองจะถูกรวบรวมโดยใช้หน่วยประมวลผล x86 (ที่ผู้ผลิตไม่ได้มีความสนใจไปที่แขนสนับสนุน) armv7ซึ่งเท่าที่ผมใช้ ฉันรู้ว่ามันจะไม่ทำงาน /usr/lib/cups/filter/rasterorp3150 failedแต่อยากรู้อยากเห็นฉันพยายามและถ้วยกล่าวว่า

ฉันค้นหาวิธีแก้ไขปัญหาบนอินเทอร์เน็ตและผู้คนแนะนำให้ใช้ Qemu แต่มันมีไว้สำหรับแพลตฟอร์ม x86 ที่สมบูรณ์ มีวิธีการแปลงไบนารี x86 เป็นอาร์มไบนารีในวิธีที่ไม่ซับซ้อนหรือไม่?

โดยวิธีการแปลงไบนารี x86 โดยใช้hexeditเครื่องมือเป็นarmv7ไบนารีเทียบเท่าเป็นความคิดที่ดี? ( opcodeการแปลง)

ถ้าเป็นเช่นนั้นทุกคนสามารถให้ความคิดเกี่ยวกับวิธีการทำมันได้หรือไม่


หากคุณมีแหล่งที่มาคุณสามารถ "รวบรวมข้าม" สำหรับส่วนโค้ง "เป้าหมาย" ที่แตกต่างกัน
bsd

คำตอบ:


14

คุณไม่สามารถแปลงx86เป็น ARM ได้อย่างง่ายดาย หากคุณไม่สามารถรับซอร์สโค้ดหรือไบนารี ARM จากผู้ผลิตและคุณต้องการใช้เครื่องพิมพ์กับ Pi2 ของคุณจริงๆแล้ววิธี Qemu นั้นถูกต้องในกรณีนี้ถึงแม้ว่ามันจะช้ามาก . Qemu ทำการจำลองระบบอย่างสมบูรณ์ แต่ก็ทำงานได้ดีมากสำหรับการจำลองกระบวนการเดียว

ฉันสมมติว่าคุณมีอนุพันธ์ Debian บางอย่างใน Pi2 ของคุณ (ฉันไม่แน่ใจว่าสิ่งนี้จะทำงานกับ Raspbian ได้) และไบนารีที่คุณมีนั้นใช้สำหรับ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 โดยอัตโนมัติ)


ในช่วงเวลาที่การแก้ปัญหานี้ไม่ทำงานฉันมักจะได้รับข้อผิดพลาด 404 ในขณะที่ทำapt updateหลังจากเพิ่มซุ้ม i386
Mohammed Noureldin

@ Mohammed คุณใช้การกระจายแบบใด
สตีเฟ่น Kitt

Raspbian, 11.2016 เปิดตัว และฉันต้องการเลียนแบบ i386
Mohammed Noureldin

ตกลงดังนั้นข้อผิดพลาดที่คุณได้รับเป็นเรื่องปกติ Raspbian ไม่มีi386ไบนารี ใช้งานได้กับสถาปัตยกรรมที่รองรับในพื้นที่ที่คุณกำลังใช้เท่านั้น
สตีเฟ่น Kitt

ฉันต้องพูดถึงว่าฉันลองกับ Rasbian และ Ubuntu ข้อเสนอ disto ที่ดีที่ฉันสามารถจำลอง i386 บนโฮสต์ armhf?
Mohammed Noureldin

1

ขอบคุณสำหรับการเล่นซ้ำอย่างละเอียดของคุณ

ฉันใช้ Rasbian OS และการเพิ่มสถาปัตยกรรม i386 ล้มเหลวใน raspbian ระหว่างการปรับปรุง sudo apt-get ฉันสามารถดาวน์โหลดแพ็คเกจ i386 แยกต่างหากสำหรับ raspbian และติดตั้งได้หรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถแชร์ลิงก์ที่จะดาวน์โหลดได้

ฉันสามารถคัดลอกไฟล์. so ที่ขึ้นกับตัวกรองจาก i386 (Linux mint ที่รันใน x86) และวางในพา ธ ที่เหมาะสมใน raspbain และใช้ Qemu เพื่อเรียกใช้ตัวกรองได้หรือไม่

ต่อไปนี้เป็นเสียงสะท้อนของตัวกรอง:

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.