GNU/Linux >> Belajar Linux >  >> Linux

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 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.

Terkait:Bagaimana cara menentukan nilai optimal untuk parameter bs ke dd?

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 .


Linux
  1. Tidak ada kesalahan file atau direktori saat menjalankan biner

  2. Bagaimana cara menghindari pesan peringatan 'adalah file yang sama' saat menggunakan cp di Linux?

  3. Jalankan aplikasi 64-bit pada sistem Ubuntu 32-bit

  1. Apakah Utilitas Linux Cerdas Saat Menjalankan Perintah Pipa?

  2. Membuka ritsleting File .gz Untuk Mendapatkan File Teks Tetapi Mendapatkan File Biner??

  3. Menjalankan skrip bash atau biner c pada sistem file dengan opsi noexec

  1. Kapan Seseorang Mendapatkan Pesan Kesalahan "pekerjaan:Tidak Ditemukan"?

  2. Menjalankan Aplikasi 32-bit Di Linux 64-bit?

  3. Cara mengkompilasi biner 32-bit pada mesin linux 64-bit dengan gcc/cmake