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". 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, sepertinya ok, memiliki hak yang benar. Saya dapat menggunakan file
, ls
, vim
di atasnya tapi begitu saya mencoba untuk melaksanakannya - ./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
), 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)
sumber
libc6-i386
paket, atauia32-libs
jika Anda ingin banyak perpustakaan).Jawaban:
Ketika Anda gagal menjalankan file yang tergantung pada "loader", kesalahan yang Anda dapatkan mungkin merujuk pada loader daripada file yang Anda jalankan.
/lib/ld.so
atau/lib/ld-linux.so.2
, dan harus merupakan file yang dapat dieksekusi./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, 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.ldd
tidak akan bekerja pada binari karena ia bekerja dengan mengatur beberapa variabel lingkungan khusus dan kemudian menjalankan program, membiarkan loader melakukan pekerjaannya.strace
juga 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
file
ditunjukkan 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.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 dukungan multiarch : jalankan
dpkg --add-architecture i386
laluapt-get update
danapt-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 menggunakanaptitude search -F %p '~Rdepends:^perl$ ~ri386'
). Anda dapat menarik koleksi perpustakaan umum dengan menginstalia32-libs
paket (Anda harus mengaktifkan dukungan multiarch terlebih dahulu). Pada Debian amd64 hingga wheezy, 32-bit loader ada dalamlibc6-i386
paket. Anda dapat menginstal perpustakaan 32-bit yang lebih besar dengan menginstalia32-libs
.sumber
ldd
tetapi saya masih mendapatkan kesalahan yang sama.lsb-core
tetapi sepertinya tidak membantu. Saya pikir saya lebih baik membuka pertanyaan baru untuk ini.Jalankan biner
ldd(1)
Andaperl
. SeringkaliNot found
kesalahan 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.
sumber
perl is not a dynamic executable
ketika 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?)