it-swarm-id.com

Mendapatkan pesan "Tidak ditemukan" saat menjalankan biner 32-bit pada sistem 64-bit

Saat ini saya memiliki masalah aneh pada debian (wheezy/AMD64).

Saya telah membuat chroot untuk menginstal server (saya tidak bisa memberikan detail lebih lanjut tentang itu, maaf). Sebut jalannya /chr_path/. Untuk mempermudah, saya telah menginisialisasi chroot ini dengan debootstrap (juga wheezy/AMD64).

Semua sepertinya bekerja dengan baik di dalam chroot tetapi ketika saya memulai skrip installer server saya, saya mendapat: zsh: Not found /some_path/Perl (installer menyertakan biner Perl karena beberapa alasan)

Secara alami, saya memeriksa /some_path/ lokasi dan saya menemukan biner "Perl". file dalam pengembalian lingkungan chroot:

/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, tampaknya 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 dimengerti bagi saya. Selain itu:

  • Saya dapat menjalankan binari dasar lainnya (/ bin/ls, ...) di chroot tanpa mendapatkan kesalahan
  • Saya memiliki masalah yang sama untuk binari lain yang datang dengan proyek
  • Ketika saya mencoba menjalankan 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 (yang satu berfungsi, dan yang lainnya tidak)
72
Elenaher

Ketika Anda gagal menjalankan file yang tergantung pada "loader", kesalahan yang Anda dapatkan mungkin merujuk pada loader daripada file yang Anda jalankan.

  • Pemuat yang dapat dieksekusi yang terhubung secara dinamis adalah bagian dari sistem yang bertanggung jawab untuk memuat pustaka dinamis. Itu seperti /lib/ld.so atau /lib/ld-linux.so.2, dan harus merupakan file yang dapat dieksekusi.
  • Pemuat skrip adalah program yang disebutkan di 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 loader adalah masalahnya. Sayangnya, memperbaiki ini akan sulit karena antarmuka kernel hanya memiliki ruang untuk melaporkan kode kesalahan numerik, tidak untuk juga menunjukkan bahwa kesalahan sebenarnya menyangkut file yang berbeda. Beberapa shell mengerjakan sendiri skripnya (membaca #! baris pada skrip dan mengerjakan kembali kondisi kesalahan), tetapi tidak ada yang saya lihat berusaha melakukan hal yang sama untuk binari asli.

ldd tidak akan berfungsi pada binari karena ia bekerja dengan menetapkan beberapa variabel lingkungan khusus dan kemudian menjalankan program, membiarkan loader melakukan pekerjaannya. strace juga tidak akan memberikan informasi yang berarti, karena itu tidak akan melaporkan lebih dari apa yang dilaporkan 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 tepat (atau keluarga sistem) dan superarchitecture tetapi subarchitecture 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, sehingga instruksinya masuk akal dan mengarahkan program ke titik di mana ia dapat mencari loadernya. Tetapi program ini adalah program 32-bit (seperti yang ditunjukkan oleh file), mencari loader 32-bit /lib/ld-linux.so.2, dan Anda mungkin hanya menginstal loader 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 oleh program. Dari Debian wheezy dan seterusnya, jika Anda menginginkan dukungan i386 dan x86_64, mulailah dengan instalasi AMD64 dan aktifkan multiarch dukungan: jalankan dpkg --add-architecture i386 kemudian apt-get update dan apt-get install libc6:i386 zlib1g:i386 … (jika Anda ingin membuat daftar dependensi paket Perl Debian, untuk melihat perpustakaan 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 mengi, loader 32-bit ada di libc6-i386 paket. Anda dapat menginstal perpustakaan 32-bit yang lebih besar dengan menginstal ia32-libs .

Jalankan ldd(1) pada biner Perl Anda. Seringkali kesalahan Not found Yang kelihatannya membingungkan pada file yang jelas ada karena salah satu pustaka bersama yang digunakan oleh program tidak ditemukan.

Jadi, chroot Anda mungkin tidak lengkap sehubungan dengan pustaka bersama yang dibutuhkan oleh binari Anda.

5
camh