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
linux
executable
Lee
quelle
quelle
LD_DEBUG=all /lib/ld-lsb.so.3 ./zls
?"su: "
, dass es den Anschein hat, als würden Sie einsystem()
oder etwas aus dem Programm heraus ausführen , und es heißt, dasssu
die 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/bin
oder so?objdump -j .interp -s ./zls
. Ich vermute, dass die Datei aufgelistet wird, die nicht existiert.Antworten:
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 Formlibrary_soname => /path/to/library_file
.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". Dochldd
hat den Lader, weilldd
ein 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.2
auf 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-core
Paket 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
.quelle
ldd
Ausgabe war. Guter Fang!readelf -a zls | grep "Requesting program interpreter"
druckt den Loader.