"Keine solche Datei oder kein solches Verzeichnis" in einer ausführbaren Datei vorhanden, und ldd meldet alle vorhandenen Bibliotheken

13

Also existiert die ausführbare Datei durch irgendeinen anderen Befehl, aber wenn ich versuche, sie auszuführen, behauptet sie, dass sie nicht da ist.

Es ist kein Sonderzeichen im Namen, weil ich es in "Katze" umbenannt habe. Und es scheint eine Binärdatei für die richtige Architektur zu sein ... "scheint", ich schätze die Frage ist, was sonst noch die Fehlermeldung BESIDES auslöst ... die Datei ist nicht da, weil es offensichtlich IST!

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 (Außerdem ist meine Distribution Debian Wheezy.)

i686

Datei 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

Katze

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

Zeit

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

real    0m0.002s
user    0m0.000s
sys     0m0.000s
Lee
quelle
1
Was ist LD_DEBUG=all /lib/ld-lsb.so.3 ./zls?
Stéphane Chazelas
1
Eine Sache dabei: Es heißt "su: ", dass es den Anschein hat, als würden Sie ein system()oder etwas aus dem Programm heraus ausführen , und es heißt, dass sudie ausführbare Datei danach nicht in dem Verzeichnis gefunden werden kann, in dem sie sich befindet. Was passiert, wenn Sie kopiere oder verlinke es mit /binoder so?
Bratchley
Lass es uns versuchen objdump -j .interp -s ./zls. Ich vermute, dass die Datei aufgelistet wird, die nicht existiert.
Derobert

Antworten:

20

Dies sieht aus wie ein fehlender Lader . Kurzgeschichte: Der vom Programm erwartete Dynamic Loader fehlt und die Fehlermeldungen sind in diesem Fall irreführend. Lassen Sie mich den relevanten Teil der Ausgabe von erklären, da ich glaube, dass ich das vorher nicht besprochen habe ldd. Das meiste davon besteht aus Linien der Form library_soname => /path/to/library_file.

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

Unter den Bibliotheken sehen wir etwas, das keine gemeinsam genutzte Bibliothek ist: Es ist das Programm, das die gemeinsam genutzten Bibliotheken lädt. Das Programm fordert an /lib/ld-lsb.so.3, aber der Kernel findet es nicht und meldet daher "Keine solche Datei oder kein solches Verzeichnis". Doch lddhat den Lader, weil lddein Wrapper - Skript, das eine hartcodierte Lader in einer speziellen Umgebung ruft, und der Lader meldet immer seinen eigenen Weg , egal was loader Pfad des Programm erwartet hat.

Sie haben /lib/ld-linux.so.2auf Ihrem System, das das ist de facto auf x86_32 Linux - Systemen Standardverzeichnis für die ELF - Loader. Das Programm erfordert /lib/ld-lsb.so.3, das der de jure Standardspeicherort ist .

Installieren Sie die minimale LSB-Unterstützung Ihrer Distribution, zum Beispiel das lsb-corePaket auf Debian. Wenn Ihre Distribution das nicht hat (die meisten tun es), erstellen Sie einen symbolischen Link /lib/ld-lsb.so.3 -> ld-linux.so.2. In ihrer Verzweiflung können Sie den Lader rufen explizit: /lib/ld-linux.so.2 ./xls.

Gilles 'SO - hör auf böse zu sein'
quelle
In der Tat ist der Loader das, was diese objdump-Zeile ausgedruckt hätte. Ich habe vergessen, dass es tatsächlich in der lddAusgabe war. Guter Fang!
Derobert
Dies ist genau das Problem, das ich mit der irreführenden Fehlermeldung gesehen habe. Ein Problem ist, dass 'ldd' nicht ausgeführt wird, wenn der Dynamic Loader nicht vorhanden ist, da es sich (zumindest auf Centos) um ein Shell-Skript handelt.
Dajobe
Vielen Dank für diesen äußerst hilfreichen Beitrag in einer Vielzahl von Beiträgen, in denen es um fehlende 32-Bit-Bibliotheken auf einem 64-Bit-System geht.
Michael Burr
readelf -a zls | grep "Requesting program interpreter"druckt den Loader.
Kevin Smyth