Saat ini saya memiliki masalah aneh pada debian (wheezy/amd64).
Saya telah membuat chroot untuk menginstal server (saya tidak dapat memberikan detail lebih lanjut tentang itu, maaf). Sebut saja jalurnya /chr_path/
.
Untuk mempermudah, saya telah menginisialisasi chroot ini dengan debootstrap (juga wheezy/amd64).
Semua tampaknya bekerja dengan baik di dalam chroot tetapi ketika saya memulai skrip penginstal server saya, saya mendapatkan :zsh: Not found /some_path/perl
(pemasang menyertakan biner perl karena beberapa alasan)
Secara alami, saya memeriksa /some_path/
lokasi dan saya menemukan biner "perl". file
di lingkungan chroot kembali :
/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
File ada, sepertinya ok, memiliki hak yang benar. Saya dapat menggunakan file
, ls
, vim
di atasnya tetapi segera setelah saya mencoba menjalankannya – ./perl
misalnya – saya mendapatkan :zsh: Not found ./perl
.
Situasi ini cukup bisa dimengerti bagi saya. Apalagi :
- Saya dapat mengeksekusi biner dasar lainnya (/bin/ls,…) di chroot tanpa mendapatkan kesalahan
- Saya memiliki masalah yang sama untuk binari lain yang disertakan dengan proyek
- Saat saya mencoba mengeksekusi biner dari root utama (
/chr_path/some_path/perl
), berhasil. - Saya telah mencoba menempatkan salah satu binari dengan salinan
ls
. saya . Saya memeriksa bahwa hak aksesnya sama tetapi ini tidak mengubah apa pun (satu berfungsi, dan yang lainnya tidak)
Jawaban yang Diterima:
Saat Anda gagal mengeksekusi file yang bergantung pada "loader", kesalahan yang Anda dapatkan mungkin merujuk ke loader, bukan file yang Anda jalankan.
- Pemuat executable asli yang ditautkan secara dinamis adalah bagian dari sistem yang bertanggung jawab untuk memuat pustaka dinamis. Ini seperti
/lib/ld.so
atau/lib/ld-linux.so.2
, dan harus berupa file yang dapat dieksekusi. - Pemuat skrip adalah program yang disebutkan pada baris Shebang, mis.
/bin/sh
untuk skrip yang dimulai dengan#!/bin/sh
. (Bash dan zsh memberikan pesan "penerjemah buruk" alih-alih "perintah tidak ditemukan" dalam kasus ini.)
Pesan kesalahan agak menyesatkan karena tidak menunjukkan bahwa pemuat adalah masalahnya. Sayangnya, memperbaikinya akan sulit karena antarmuka kernel hanya memiliki ruang untuk melaporkan kode kesalahan numerik, bukan juga untuk menunjukkan bahwa kesalahan sebenarnya menyangkut file yang berbeda. Beberapa shell bekerja sendiri untuk skrip (membaca #!
baris pada skrip dan mengerjakan kembali kondisi kesalahan), tetapi tidak ada yang saya lihat mencoba melakukan hal yang sama untuk binari asli.
ldd
tidak akan bekerja pada binari baik karena bekerja dengan mengatur beberapa variabel lingkungan khusus dan kemudian menjalankan program, membiarkan loader melakukan pekerjaan. strace
juga tidak akan memberikan informasi yang berarti, karena tidak akan melaporkan lebih dari yang dilaporkan oleh kernel, dan seperti yang telah kita lihat, kernel tidak dapat melaporkan semua yang diketahuinya.
Situasi ini sering muncul ketika Anda mencoba menjalankan biner untuk sistem yang benar (atau keluarga sistem) dan superarsitektur tetapi subarsitektur yang salah. Di sini Anda memiliki binari ELF pada sistem yang mengharapkan binari ELF, jadi kernel memuatnya dengan baik. Mereka adalah binari i386 yang berjalan pada prosesor x86_64, jadi instruksinya masuk akal dan membawa program ke titik di mana ia dapat mencari pemuatnya. Tapi programnya adalah program 32-bit (sebagai file
output menunjukkan), mencari pemuat 32-bit /lib/ld-linux.so.2
, dan Anda mungkin hanya menginstal pemuat 64-bit /lib64/ld-linux-x86-64.so.2
di chroot.
Anda perlu menginstal sistem runtime 32-bit di chroot:loader, dan semua perpustakaan yang dibutuhkan program. Dari Debian wheezy dan seterusnya, jika Anda menginginkan dukungan i386 dan x86_64, mulailah dengan instalasi amd64 dan aktifkan dukungan multiarch:jalankan dpkg --add-architecture i386
lalu apt-get update
dan apt-get install libc6:i386 zlib1g:i386 …
(jika Anda ingin membuat daftar dependensi paket perl Debian, untuk melihat pustaka apa yang mungkin diperlukan, Anda dapat menggunakan aptitude search -F %p '~Rdepends:^perl$ ~ri386'
). Anda dapat menarik koleksi perpustakaan umum dengan menginstal ia32-libs
paket (Anda harus mengaktifkan dukungan multiarch terlebih dahulu). Pada Debian amd64 hingga wheezy, loader 32-bit ada di libc6-i386
kemasan. Anda dapat menginstal kumpulan pustaka 32-bit yang lebih besar dengan menginstal ia32-libs
.