Yürütülebilir dosyada “böyle bir dosya veya dizin yok” ancak dosya var ve ldd tüm kitaplıkları rapor ediyor


13

Yani başka bir komutla yürütülebilir dosya var, ancak çalıştırmayı denediğimde, orada olmadığını iddia ediyor.

Adında özel bir karakter değil, çünkü onu bir "kedi" olarak değiştirdim. Ve doğru mimari için bir ikili gibi görünüyor ... "görünüyor", soru şu, başka ne tat hata mesajı BESIDES atar ... dosya orada değil, çünkü belli ki IS!

ldd xls

    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 (Ayrıca, dağıtımım Debian wheezy.)

i686

dosya 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

kedi

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

zaman

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

real    0m0.002s
user    0m0.000s
sys     0m0.000s

1
Ne olmuş LD_DEBUG=all /lib/ld-lsb.so.3 ./zls?
Stéphane Chazelas

1
Bununla ilgili "su: "bir system()şey: programın içinden bir şey ya da bir şey yürüttüğünüzü söylüyor ve bunu yaptıktan sonra sudizinde çalıştırılabilir dosyayı bulamadığını söylüyor . kopyala veya işaret et /binya da başka bir şey?
Bratchley

Deneyelim objdump -j .interp -s ./zls. Varolmayan dosyayı listeleyeceğinden şüpheleniyorum.
derobert

Yanıtlar:


20

Bu eksik bir yükleyici gibi görünüyor . Kısa öykü: program tarafından beklenen dinamik yükleyici eksik ve bu durumda hata mesajları yanıltıcı. Bunu daha önce tartıştığımı düşünmediğim için, çıktısının ilgili kısmını açıklayayım ldd. Çoğu formdaki çizgilerden oluşur library_soname => /path/to/library_file.

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

Kütüphaneler arasında, paylaşılan bir kütüphane olmayan bir şey görüyoruz: paylaşılan kütüphaneleri yükleyen program. Program /lib/ld-lsb.so.3istiyor, ancak çekirdek programı bulamıyor, bu nedenle “Böyle bir dosya veya dizin yok” bildiriyor. Ancak lddyükleyiciyi bulur, çünkü lddözel bir ortamda sabit kodlu bir yükleyiciyi çağıran bir sarıcı komut dosyasıdır ve programcı hangi yükleyici yolundan beklerse sürsün yükleyici her zaman kendi yolunu rapor eder.

Sen var /lib/ld-linux.so.2olan sisteminizde, üzerinde fiilen x86_32 Linux sistemlerinde ELF yükleyici için standart bir konum. Program gerektirir /lib/ld-lsb.so.3olan hukuken standart konum.

Dağıtımınızın minimum LSB desteğini, örneğin lsb-coreDebian'daki paketi yükleyin . Dağıtımınız buna sahip değilse (çoğunda), sembolik bir bağlantı oluşturun /lib/ld-lsb.so.3 -> ld-linux.so.2. Çaresizlik içinde açıkça yükleyici çağırabilirsiniz: /lib/ld-linux.so.2 ./xls.


Aslında, yükleyici, bu objdump hattının yazdırdığı şeydir. Aslında lddçıktıda olduğunu unuttum . İyi yakalama!
derobert

Yanıltıcı hata mesajı ile tam olarak gördüğüm sorun bu. Bir sorun, dinamik yükleyici yoksa (en azından centosta) bir kabuk komut dosyası olduğu için 'ldd' nin çalışmayacağıdır.
dajobe

64-bit bir sistemde 32-bit libs eksikliğinden bahseden bir deniz denizi arasındaki bu en yararlı gönderi için teşekkür ederiz.
Michael Burr

readelf -a zls | grep "Requesting program interpreter"yükleyiciyi yazdıracaktır.
Kevin Smyth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.