Linux dapat dieksekusi gagal dengan "File tidak ditemukan" meskipun file ada di sana dan di PATH

18

Saya ingin meluncurkan wineexecutable (Versi 2.12), tetapi saya mendapatkan kesalahan berikut ( $= shell prompt):

$ wine
bash: /usr/bin/wine: No such file or directory
$ /usr/bin/wine
bash: /usr/bin/wine: No such file or directory
$ cd /usr/bin
$ ./wine
bash: ./wine: No such file or directory

Namun, file itu ada di sana:

$ which wine
/usr/bin/wine

Eksekusi pasti ada dan tidak ada symlink mati:

$ stat /usr/bin/wine
  File: /usr/bin/wine
  Size: 9712            Blocks: 24         IO Block: 4096   regular file
Device: 802h/2050d      Inode: 415789      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-07-13 13:53:00.000000000 +0200
Modify: 2017-07-08 03:42:45.000000000 +0200
Change: 2017-07-13 13:53:00.817346043 +0200
 Birth: -

Ini adalah ELF 32-bit:

$ file /usr/bin/wine
/usr/bin/wine: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, 
BuildID[sha1]=eaf6de433d8196e746c95d352e0258fe2b65ae24, stripped

Saya bisa mendapatkan bagian dinamis yang dapat dieksekusi:

$ readelf -d /usr/bin/wine
Dynamic section at offset 0x1efc contains 27 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libwine.so.1]
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000001d (RUNPATH)                    Library runpath: [$ORIGIN/../lib32]
 0x0000000c (INIT)                       0x7c000854
 0x0000000d (FINI)                       0x7c000e54
 [more addresses without file names]

Namun, saya tidak bisa daftar dependensi objek bersama menggunakan ldd:

$ ldd /usr/bin/wine
/usr/bin/ldd: line 117: /usr/bin/wine: No such file or directory

strace menunjukkan:

execve("/usr/bin/wine", ["wine"], 0x7fff20dc8730 /* 66 vars */) = -1 ENOENT (No such file or directory)
fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
getpid()                                = 23783
exit_group(1)                           = ?
+++ exited with 1 +++

Diedit untuk menambahkan saran oleh @jww : Masalahnya tampaknya terjadi sebelum pustaka yang terhubung secara dinamis diminta, karena tidak ada ldpesan debug yang dihasilkan:

$ LD_DEBUG=all wine
bash: /usr/bin/wine: No such file or directory

Bahkan ketika hanya mencetak nilai yang mungkin LD_DEBUG, kesalahan terjadi sebagai gantinya

$ LD_DEBUG=help wine
bash: /usr/bin/wine: No such file or directory

Diedit untuk menambahkan saran dari @Raman Sailopal: Masalahnya tampaknya terletak di dalam executable, karena menyalin konten /usr/bin/wineke file lain yang sudah dibuat menghasilkan kesalahan yang sama

root:bin # cp cat testcmd    

root:bin # testcmd --help
Usage: testcmd [OPTION]... [FILE]...
Concatenate FILE(s) to standard output.
[rest of cat help page]

root:bin # dd if=wine of=testcmd  
18+1 records in
18+1 records out
9712 bytes (9.7 kB, 9.5 KiB) copied, 0.000404061 s, 24.0 MB/s

root:bin # testcmd
bash: /usr/bin/testcmd: No such file or directory

Apa masalahnya atau apa yang bisa saya lakukan untuk mencari tahu file atau direktori mana yang hilang?


uname -a:

Linux laptop 4.11.3-1-ARCH #1 SMP PREEMPT Sun May 28 10:40:17 CEST 2017 x86_64 GNU/Linux
akraf
sumber
apakah ./wine di / usr / bin berfungsi?
Aiden Bell
1
Arch adalah multilib-mampu. Repositori multilib diaktifkan di /etc/pacman.conf. Semua dependensi winepaket diinstal. Namun, instal ulang mereka hanya untuk memastikan ...
akraf
3
Apakah /lib/ld-linux.so.2ada di sistem Anda? Semua gejala menunjukkan itu hilang, hanya memeriksa.
n. 'kata ganti' m.
1
@nm Ya, Anda benar. Faktanya, seluruh direktori /libtidak ada :-)
akraf
3
Pengalaman;) ketika Anda mencoba menjalankan executable dan mendapatkan kesalahan "file tidak ditemukan" sementara file jelas di sini, itu adalah juru bahasa yang hilang. filePerintah Anda menunjukkan juru bahasa apa yang diatur untuk dieksekusi ini.
n. 'kata ganti' m.

Jawaban:

11

Ini:

$ file /usr/bin/wine
/usr/bin/wine: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, 
BuildID[sha1]=eaf6de433d8196e746c95d352e0258fe2b65ae24, stripped

Dikombinasikan dengan ini:

$ ldd /usr/bin/wine
/usr/bin/ldd: line 117: /usr/bin/wine: No such file or directory

Sangat menyarankan bahwa sistem tidak memiliki /lib/ld-linux.so.2juru ELF. Yaitu, sistem 64-bit ini tidak memiliki pustaka kompatibilitas 32-bit yang diinstal. Dengan demikian, jawaban @ user1334609 pada dasarnya benar.

Florian Weimer
sumber
4

OK, saya sibuk selama delapan jam terakhir untuk mengaktifkan dan menjalankan sistem saya lagi setelah CPU terlalu panas dimatikan. Saat reboot, menjadi jelas bahwa itu sangat kacau sehingga bahkan konsol in -rd kembali tidak mengenali keyboard saya lagi. Ini adalah misteri bagi saya bagaimana sistem berhasil tetap beroperasi begitu lama, sementara saya mencoba menerapkan saran yang tak terhitung jumlahnya oleh Anda (terima kasih banyak !!)

Masalah saat reboot:

Warning: /lib/modules/4.11.3-1-ARCH/modules.devname not found - ignoring
ERROR: device 'UUID=...' not found. Skipping fsck.
ERROR: Unable to find root device 'UUID=...'.
You are being dropped to a recovery shell
Type 'exit' to try and continue booting
sh: can't access tty: job control turned off

dan tidak ada keyboard yang berfungsi setelahnya :-)

Masalahnya adalah: Pembaruan menggantikan symlink /lib -> /usr/libdengan direktori. Jadi itu berarti semua pustaka dan modul kernel, yang diharapkan ada /libtidak ada :-)

Jadi saya membuat ulang symlink dan menginstal ulang sistem basis dari CD live.

Sekarang saya memiliki internet lagi, saya juga menemukan utas ini

Saya juga menggunakan manajer paket instalasi di-disk saya yang terbuat dari batu bata (dipanggil pacman) dari live CD untuk menginstal ulang semua paket dari kelompok dasar (mungkin hanya kernel, jadi paket linuxsudah cukup, saya tidak tahu)

Untuk mencapai itu, pasang partisi utama dari instalasi bricked ke /mntdirektori sistem live CD dan gunakan chrootuntuk membuat pacmanthink /mntis /(masukkan partisi utama bricked system Anda untuk sdXXX)

mount /dev/sdXXX /mnt
# Recreate the /lib -> usr/lib symlink
ln -s usr/lib /lib  
# Mount essential system folders also to the respective subfolders of /mnt
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
mount -o bind /dev /mnt/dev
# Fake /mnt to be /, so that pacman installs the packages to the correct  places
chroot /mnt
# Reinstall the Arch Linux base system
pacman -Sy base

Sebagai catatan: buat symlink relatif, jadi ln -s usr/lib /mnt/libdan tidak ln -s /usr/lib /mnt/lib, karena selama boot sistem awal (tahap initrd) partisi utama akan di-mount terlebih dahulu /new_root. Apakah symlink menjadi absolut, Anda akan mendapatkan kesalahan yang disebutkan di atas saat boot awal.

akraf
sumber
1
Petunjuk kecil: Saat menggunakan systemrescuecd, saya sering hanya mengulangi proc / sys / dev (untuk path di proc sys dev; lakukan mount -obind / $ path / mnt / $ path; selesai) sebelum melakukan chroot. Namun jika Anda menggunakan arch install iso, jauh lebih mudah untuk menjalankan arch-chroot yang disediakan dan dapat dieksekusi karena dapat melakukan semuanya untuk Anda. Ada dalam paket arch-install-script jika seseorang ingin melihat-lihat. :)
zaTricky
4

Anda mencoba menjalankan aplikasi 32-bit pada sistem operasi 64 bit, jadi Anda perlu menginstal pustaka kompatibilitas 32-bit (khususnya glibc) sebelum ini dapat berfungsi.

pengguna1334609
sumber
1
Tolong jelaskan bagaimana solusi Anda menyelesaikan kasus ini dan jawab pertanyaan
Romeo Ninov
Apa yang dikatakan Romeo; Anda akan menjalankan apt-get pada sistem arch-linux, bukan pacman? Dan bagaimana kompresi pustaka dan ncurses membantu mereka?
Jeff Schaller
1

FYI, saya mengalami masalah yang sama ini berjalan pada gambar buruh pelabuhan berbasis alpine. Eksekusi adalah ELF 64-bit, dan gambar alpine adalah 64-bit, dan executable bekerja dalam wadah yang berbeda. Jadi mungkin pustaka alpine yang dipangkas tidak kompatibel dengan executable saya. The Node.js Docker Halaman hub catatan:

Peringatan utama [untuk berjalan dalam wadah berbasis Alpine] adalah bahwa ia menggunakan musl libc alih-alih glibc dan teman-teman , sehingga perangkat lunak tertentu mungkin mengalami masalah tergantung pada kedalaman persyaratan libc mereka. Namun, sebagian besar perangkat lunak tidak memiliki masalah dengan ini, jadi varian ini biasanya merupakan pilihan yang sangat aman. Lihat utas komentar Peretas ini untuk diskusi lebih lanjut tentang masalah yang mungkin timbul dan beberapa perbandingan pro / kontra dalam menggunakan gambar berbasis Alpine.

Solusi saya adalah menggunakan gambar kontainer yang berbeda (misalnya berbasis Debian Jessie).

Jeff Ward
sumber
Terima kasih telah menghubungkan masalah awalnya sysadmin ini ke dunia wadah "baru"!
akraf