Chạy nhị phân X86 trên armv7


11

Tôi đang cố chạy máy in USB SNBC trên Raspberry Pi2.

Vì vậy, tôi cần sao chép bộ lọc nhị phân của máy in USB SNBC sang /usr/lib/cups/filter. Nhưng nhị phân bộ lọc được biên dịch bằng bộ xử lý x86 (Nhà sản xuất không có lợi ích để hỗ trợ cánh tay) khi tôi sử dụng armv7. Tôi biết nó sẽ không làm việc nhưng đối với một sự tò mò tôi đã cố gắng và ly nói /usr/lib/cups/filter/rasterorp3150 failed.

Tôi đã tìm kiếm các giải pháp trên internet và mọi người đề nghị sử dụng Qemu. Nhưng nó là cho một nền tảng x86 hoàn chỉnh. Có cách nào để chuyển đổi nhị phân x86 sang nhị phân cánh tay một cách dễ dàng không phức tạp?

Nhân tiện, chuyển đổi nhị phân x86 bằng cách sử dụng một hexeditcông cụ thành armv7nhị phân tương đương có phải là một ý tưởng tốt? ( opcodechuyển đổi)

Nếu vậy, bất cứ ai có thể đưa ra một số ý tưởng về cách làm điều đó?


Nếu bạn có nguồn, bạn có thể "biên dịch chéo" cho một vòm "mục tiêu" khác.
bsd

Câu trả lời:


13

Bạn không thể dễ dàng chuyển đổi nhị phân x86 sang ARM. Nếu bạn không thể lấy mã nguồn hoặc nhị phân ARM từ nhà sản xuất và bạn thực sự muốn sử dụng máy in với Pi2, thì cách tiếp cận Qemu là phương pháp đúng trong trường hợp này, mặc dù có thể sẽ rất chậm . Qemu thực hiện mô phỏng toàn hệ thống nhưng nó cũng hoạt động rất tốt cho mô phỏng quá trình đơn.

Tôi giả sử bạn có một số loại dẫn xuất Debian trên Pi2 của bạn (tôi không chắc chắn điều này sẽ hoạt động với Raspbian) và rằng nhị phân bạn có là i386(nếu là 64 bit, amd64thay vào đó hãy sử dụng ). Bắt đầu bằng cách thêm i386như một kiến ​​trúc nước ngoài:

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

Sau đó chạy lddtrên nhị phân và thêm bất kỳ thư viện cần thiết; thông thường

sudo apt-get install libc6:i386

và bất cứ điều gì khác với :i386hậu tố được thêm vào. Hãy chắc chắn rằng điều này không loại bỏ bất kỳ gói cài đặt nào; hy vọng tất cả mọi thứ bạn cần là đa kích hoạt. (Nếu không thì phần còn lại sẽ không hoạt động.)

Khi bạn đã thực hiện điều đó, hãy cài đặt qemu-user-staticnếu nó chưa được cài đặt (cùng với binfmt-supportkhuyến nghị của nó ); sau đó bạn có thể sử dụng qemu-i386-staticđể chạy chương trình của mình:

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

Trong thực tế nhờ binfmt-supportnó nên chạy trực tiếp (như được chỉ ra bởi Toby Speight ):

/usr/lib/cups/filter/rasterorp3150

( binfmt-supportsẽ sử dụng Qemu để thực hiện công việc này một cách minh bạch.)

Nếu bạn không muốn sử dụng binfmt-support, hãy chuyển rasterorp3150đi:

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

và cài đặt một tập lệnh chứa

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

như /usr/lib/cups/filter/rasterorp3150.

Nếu bạn muốn, bạn có thể thiết lập một chroot cho tất cả điều này; xem debootstrap--foreigntùy chọn của nó (chroot có thể được thiết lập để sử dụng Qemu tự động).


Trong thời gian là giải pháp này không làm việc, tôi luôn nhận được lỗi 404 khi làm apt updatesau khi thêm i386 vòm.
Mohammed Noureldin

@Mohammed bạn đang sử dụng phân phối nào?
Stephen Kitt

Raspbian, phát hành 11.2016. và tôi muốn mô phỏng i386
Mohammed Noureldin

OK, do đó, lỗi bạn gặp là bình thường, Raspbian không cung cấp i386nhị phân. Điều này chỉ hoạt động với các kiến ​​trúc được hỗ trợ trong bản phân phối bạn đang sử dụng.
Stephen Kitt

Tôi đã phải đề cập rằng tôi đã thử điều đó với cả Rasbian và Ubuntu. Bất kỳ suggesion tốt nào mà tôi có thể mô phỏng i386 trên máy chủ armhf?
Mohammed Noureldin

1

Cảm ơn cho phát lại chi tiết của bạn.

Tôi sử dụng hệ điều hành Rasbian và việc thêm kiến ​​trúc i386 bị ​​lỗi trong raspbian trong quá trình cập nhật sudo apt-get. Tôi có thể tải xuống gói i386 riêng cho raspbian và cài đặt không?. Nếu vậy bạn có thể chia sẻ bất kỳ liên kết để tải về.

Tôi có thể sao chép các tệp .so phụ thuộc vào bộ lọc từ i386 (Linux mint chạy trong x86) và dán vào các đường dẫn thích hợp trong raspbain và sử dụng Qemu để chạy bộ lọc không?

Sau đây là tiếng vang ldd của bộ lọc:

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)

Trân trọng, Nash

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.