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

70

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). Mari kita 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 dari server saya, saya dapat: zsh: Not found /some_path/perl(installer menyertakan biner perl untuk beberapa alasan)

Secara alami, saya memeriksa /some_path/lokasi dan saya menemukan biner "perl". filedalam 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, sepertinya ok, memiliki hak yang benar. Saya dapat menggunakan file, ls, vimdi atasnya tapi begitu saya mencoba untuk melaksanakannya - ./perlmisalnya - 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), ia berfungsi.
  • Saya telah mencoba untuk meletakkan salah satu binari dengan salinan saya ls. Saya memeriksa bahwa hak aksesnya sama tetapi ini tidak mengubah apa pun (yang satu berfungsi, dan yang lain tidak)
Elenaher
sumber
1
Ini adalah masalah yang sama dengan "Tidak ada file atau direktori" terletak pada binari yang diinstal Optware . Perhatikan bahwa Perl Anda dapat dieksekusi 32-bit. Anda melewatkan sistem runtime 32-bit ( libc6-i386paket, atau ia32-libsjika Anda ingin banyak perpustakaan).
Gilles 'SO- stop being evil'
@Gilles: Terima kasih banyak! Instalasi aptitude ia32-libs telah memecahkan masalah !! Saya telah melihat bahwa perl itu 32 bit tetapi karena itu bekerja pada sistem utama (distrib yang sama) saya baru saja berasumsi bahwa itu tidak terhubung. Sebenarnya, saya harus menginstal sistem runtime 32-bit pada sistem utama di beberapa titik.
Elenaher
1
@Gilles: Saya pikir saya akan menambahkan itu sebagai jawaban singkat alih-alih menandainya sebagai pertanyaan rangkap. Lingkungannya cukup berbeda sehingga walaupun masalahnya sama, mencari orang lebih mungkin mengenai satu atau yang lainnya.
Caleb
1
@ Caleb Kami tidak menghapus duplikat untuk alasan itu; pencari yang menemukan ini hanya akan mengikuti tautan duplikat ke posting lain. Jika ini masalah yang sama, mungkin harus ditutup
Michael Mrozek
@MichaelMrozek Saya berubah pikiran tentang pertanyaan ini: sementara masalah mendasarnya sama, solusi konkretnya sedikit berbeda (tidak mencampurkan ARM ABI dalam satu kasus, memungkinkan dukungan 32-bit pada distribusi Linux amd64 di yang lain) . Jadi saya kira pertanyaan ini memang terbuka.
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

72

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. Ini seperti /lib/ld.soatau /lib/ld-linux.so.2, dan harus merupakan file yang dapat dieksekusi.
  • Loader skrip adalah program yang disebutkan pada baris shebang, misalnya /bin/shuntuk 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, bukan untuk juga menunjukkan bahwa kesalahan tersebut sebenarnya menyangkut file yang berbeda. Beberapa shell bekerja sendiri untuk skrip (membaca #!baris pada skrip dan memperbaiki kembali kondisi kesalahan), tetapi tidak ada yang pernah saya coba lakukan hal yang sama untuk biner asli.

lddtidak akan bekerja pada binari karena ia bekerja dengan mengatur beberapa variabel lingkungan khusus dan kemudian menjalankan program, membiarkan loader melakukan pekerjaannya. stracejuga tidak akan memberikan informasi yang berarti, karena tidak akan melaporkan lebih dari apa yang dilaporkan kernel, dan seperti yang 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 arsitektur super tapi 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, sehingga instruksinya masuk akal dan mengarahkan program ke titik di mana ia dapat mencari loadernya. Tetapi program ini adalah program 32-bit (seperti yang fileditunjukkan oleh output), mencari loader 32-bit /lib/ld-linux.so.2, dan Anda mungkin hanya menginstal loader 64-bit /lib64/ld-linux-x86-64.so.2di 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 dukungan multiarch : jalankan dpkg --add-architecture i386lalu apt-get updatedan apt-get install libc6:i386 zlib1g:i386 …(jika Anda ingin membuat daftar dependensi paket perl Debian, untuk melihat perpustakaan apa yang cenderung untuk diperlukan, Anda dapat menggunakan aptitude search -F %p '~Rdepends:^perl$ ~ri386'). Anda dapat menarik koleksi perpustakaan umum dengan menginstal ia32-libspaket (Anda harus mengaktifkan dukungan multiarch terlebih dahulu). Pada Debian amd64 hingga wheezy, 32-bit loader ada dalam libc6-i386paket. Anda dapat menginstal perpustakaan 32-bit yang lebih besar dengan menginstal ia32-libs.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Apakah ini satu-satunya hal yang dapat memicu pesan kesalahan? Saya sudah menginstal perpustakaan 32-bit dan inilah outputnyaldd tetapi saya masih mendapatkan kesalahan yang sama.
Nathan Osman
1
@NathanOsman Mungkin unix.stackexchange.com/questions/76490/...
Gilles 'SO- berhenti menjadi jahat'
Saya mencoba menginstal lsb-coretetapi sepertinya tidak membantu. Saya pikir saya lebih baik membuka pertanyaan baru untuk ini.
Nathan Osman
Terima kasih untuk ini, Anda baru saja mengakhiri dua hari menggaruk kepala. Saya pikir semuanya dikompilasi secara statis tetapi tidak!
Finn O'leary
5

Jalankan biner ldd(1)Anda perl. Seringkali Not foundkesalahan yang kelihatannya membingungkan pada file yang jelas ada adalah 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.

camh
sumber
Sebenarnya saya dapatkan: perl is not a dynamic executableketika saya di chroot dan saya mendapatkan daftar dependensi yang benar dari luar. Saya saat ini memeriksa apakah ada sesuatu yang aneh tapi saya menggunakan debootstrap untuk menghindari kekurangan semacam ini dan sudah memiliki banyak libs (ada perl yang dapat dieksekusi dalam sistem chroot yang berjalan dengan baik tetapi ini adalah versi yang berbeda; mungkin saya hanya akan melakukan beberapa symbolic link?)
Elenaher
Sejujurnya, saya berharap debootstrap telah menghasilkan chroot lengkap, jadi saya tidak akan mengharapkan jawaban saya benar dalam hal itu. Tapi saya sudah menemukan perpustakaan yang hilang dalam masalah chroot sebelumnya, jadi saya pikir saya akan melihat apakah jawaban saya akan terbang.
camh
lih. berkomentar kepada Gilles di pos utama: Anda benar. Ada beberapa lib yang hilang. Keuntungan utama dari debootstrap adalah bahwa saya bisa menyelesaikan masalah dengan instalasi bakat dasar :)
Elenaher