Tak więc przez każde inne polecenie plik wykonywalny istnieje, ale kiedy próbuję go wykonać, twierdzi, że go nie ma.
To nie jest szczególny znak w nazwie, ponieważ przemianowałem go na „kot”. I wydaje się, że jest to plik binarny dla poprawnej architektury ... „wydaje się”, myślę, że pytanie brzmi, co jeszcze wyświetla komunikat o błędzie BESIDES… pliku nie ma, ponieważ oczywiście JEST!
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 (Moja dystrybucja to serwatka Debiana.)
i686
plik 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
kot
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
czas
root@pc170:# time ./zls
-su: ./zls: No such file or directory
real 0m0.002s
user 0m0.000s
sys 0m0.000s
linux
executable
Zawietrzny
źródło
źródło
LD_DEBUG=all /lib/ld-lsb.so.3 ./zls
?"su: "
co sprawia, że wydaje się, że wykonujesz jakiśsystem()
program wewnątrz programu i mówi, że po tym niesu
może znaleźć pliku wykonywalnego w katalogu, w którym się znajduje. Co się stanie, jeśli skopiować czy dowiązać do niego/bin
czy coś?objdump -j .interp -s ./zls
. Podejrzewam, że wyświetli plik, który nie istnieje.Odpowiedzi:
To wygląda jak brakujący moduł ładujący . Krótka historia: brak oczekiwanego przez program dynamicznego modułu ładującego, w tym przypadku komunikaty o błędach wprowadzają w błąd. Ponieważ nie sądzę, żebym to wcześniej omawiał, pozwól mi wyjaśnić istotną część wyników
ldd
. Większość z nich składa się z linii formylibrary_soname => /path/to/library_file
.Wśród bibliotek widzimy coś, co nie jest biblioteką współdzieloną: to program, który ładuje biblioteki współdzielone. Program żąda
/lib/ld-lsb.so.3
, ale jądro go nie znajduje, więc zgłasza „Brak takiego pliku lub katalogu”. Jednakldd
znajduje moduł ładujący, ponieważldd
jest to skrypt otoki, który wywołuje program ładujący na stałe w specjalnym środowisku, a moduł ładujący zawsze zgłasza własną ścieżkę, bez względu na ścieżkę programu ładującego, której program się spodziewał.Masz
/lib/ld-linux.so.2
w swoim systemie, który jest de facto standardową lokalizacją modułu ładującego ELF w systemach Linux x86_32. Program wymaga/lib/ld-lsb.so.3
, która jest de iure średnia lokalizacja.Zainstaluj minimalną obsługę LSB Twojej dystrybucji, na przykład
lsb-core
pakiet na Debianie. Jeśli Twoja dystrybucja tego nie ma (większość ma), utwórz dowiązanie symboliczne/lib/ld-lsb.so.3 -> ld-linux.so.2
. W desperacji można nazwać ładowarka wyraźnie:/lib/ld-linux.so.2 ./xls
.źródło
ldd
wyjściu. Dobry chwyt!readelf -a zls | grep "Requesting program interpreter"
wydrukuje moduł ładujący.