“Tidak ada file atau direktori seperti itu” pada file yang dapat dieksekusi, namun file tersebut ada dan ldd melaporkan semua perpustakaan yang ada

13

Jadi dengan perintah lain file executable ada, namun ketika saya mencoba untuk mengeksekusinya, ia mengklaim tidak ada.

Itu bukan karakter khusus dalam nama karena saya menamainya dengan "kucing". Dan tampaknya menjadi biner untuk arsitektur yang benar ... "sepertinya", saya kira pertanyaannya adalah, apa lagi melempar pesan kesalahan tat SELAIN ... file tidak ada di sana, karena jelas IS!

xd ldd

    linux-gate.so.1 =>  (0xb77bc000)
    libQtGui.so.4 => /usr/lib/i386-linux-gnu/libQtGui.so.4 (0xb6cc2000)
    libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb6c98000)
    libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xb6c8f000)
    libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xb6c76000)
    libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xb6c6d000)
    libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb6bd1000)
    libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb6b9b000)
    libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb6b88000)
    libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb6a50000)
    libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb6a2a000)
    libQtSql.so.4 => /usr/lib/i386-linux-gnu/libQtSql.so.4 (0xb69ea000)
    libQtCore.so.4 => /usr/lib/i386-linux-gnu/libQtCore.so.4 (0xb6704000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb66ea000)
    libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb66e7000)
    libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb65ea000)
    libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb6598000)
    librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb658f000)
    libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb6575000)
    libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb6571000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb6485000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6468000)
    libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb6305000)
    libaudio.so.2 => /usr/lib/i386-linux-gnu/libaudio.so.2 (0xb62ea000)
    libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xb62e4000)
    libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xb62ba000)
    libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6297000)
    /lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)
    libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb6258000)
    libffi.so.5 => /usr/lib/i386-linux-gnu/libffi.so.5 (0xb624f000)
    libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0xb61f1000)
    libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb61ee000)
    libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb61e8000)

uname -m (Juga, distribusi saya adalah Wheezy Debian.)

i686

file xls

xls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
     dynamically linked (uses shared libs), for GNU/Linux 2.6.15,
     BuildID[sha1]=0xa9786f61b371a683ae4306792f95e0636c288883, not stripped

ls -ld xls

-rwxr-xr-x 1 root root 4634064 May 20 14:35 xls

kucing

root@pc170:# cat xls > zls
root@pc170:# ./zls
-su: ./zls: Permission denied
root@pc170:# chmod +x zls
root@pc170:# ./zls
-su: ./zls: No such file or directory

waktu

root@pc170:# time ./zls
-su: ./zls: No such file or directory

real    0m0.002s
user    0m0.000s
sys     0m0.000s
Lee
sumber
1
Bagaimana dengan LD_DEBUG=all /lib/ld-lsb.so.3 ./zls?
Stéphane Chazelas
1
Satu hal tentang ini: ia mengatakan "su: "yang membuatnya tampak seperti Anda mengeksekusi system()atau sesuatu dari dalam program dan mengatakan bahwa setelah melakukan itu tidak sudapat menemukan executable di direktori itu berakhir. Apa yang terjadi jika Anda salin atau symlink ke /binatau sesuatu?
Bratchley
Ayo coba objdump -j .interp -s ./zls. Saya menduga bahwa akan mencantumkan file yang tidak ada.
derobert

Jawaban:

20

Ini memang terlihat seperti loader yang hilang . Cerpen: loader dinamis yang diharapkan oleh program tidak ada, dan pesan kesalahan menyesatkan dalam kasus ini. Karena saya tidak berpikir saya sudah membahas itu sebelumnya, izinkan saya menjelaskan bagian yang relevan dari output ldd. Sebagian besar terdiri dari garis-garis bentuk library_soname => /path/to/library_file.

/lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)

Di antara pustaka, kami melihat sesuatu yang bukan pustaka bersama: ini adalah program yang memuat pustaka bersama. Program meminta /lib/ld-lsb.so.3, tetapi kernel tidak menemukannya, jadi ia melaporkan “Tidak ada file atau direktori”. Namun lddtidak menemukan loader, karena lddadalah skrip wrapper yang memanggil loader hard-coded di lingkungan khusus, dan loader selalu melaporkan jalurnya sendiri, apa pun jalur loader yang diharapkan program.

Anda miliki /lib/ld-linux.so.2di sistem Anda, yang merupakan lokasi standar de facto untuk pemuat ELF pada sistem Linux x86_32. Program ini membutuhkan /lib/ld-lsb.so.3, yang merupakan lokasi standar de jure .

Instal dukungan minimal LSB distribusi Anda, misalnya lsb-corepaket di Debian. Jika distribusi Anda tidak memiliki (sebagian besar), buat tautan simbolik /lib/ld-lsb.so.3 -> ld-linux.so.2. Dalam keputusasaan Anda dapat menghubungi loader secara eksplisit: /lib/ld-linux.so.2 ./xls.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Memang, loader itulah yang akan dicetak garis objdump. Saya lupa itu sebenarnya di lddoutput. Tangkapan yang bagus!
derobert
Ini persis masalah yang saya lihat, dengan pesan kesalahan yang menyesatkan. Satu masalah adalah 'ldd' tidak akan berjalan jika loader dinamis tidak ada karena itu (setidaknya pada centos) skrip shell.
dajobe
Terima kasih atas pos paling bermanfaat ini di antara banyak posting yang membahas tentang hilangnya 32-bit lib pada sistem 64-bit.
Michael Burr
readelf -a zls | grep "Requesting program interpreter"akan mencetak loader.
Kevin Smyth