Nie ma takiego pliku lub katalogu? Ale plik istnieje!

186

Pobrałem grę (Shank), ale plik bin nie działa. Błąd wyświetlany przy próbie uruchomienia pliku wykonywalnego to:

bash: ./shank-linux-120720110-1-bin: No such file or directory
Francesco
źródło
2
Może najpierw „chmod u + x ./shank*bin”?
agent86
też nie powinno to być „.bin” zamiast „-bin”, może to tylko literówka
Anake
Dziękuję za odpowiedź. Wykonałem polecenie, które powiedziałeś Agent86, ale mam ten sam wynik. Pobrałem również plik .deb, ale jest też problem. Nie wiem na czym polega ta gra.
Francesco
Potwierdź, czy korzystasz z instalacji 64-bitowej (jest to najczęstszy przypadek tego problemu).
Gilles
Tak, potwierdzam, że używam architektury 64-bitowej na moim laptopie.
Francesco

Odpowiedzi:

235

Prawdopodobnie próbujesz uruchomić 32-bitowy plik binarny w 64-bitowym systemie, który nie ma zainstalowanej obsługi 32-bitowej.

Istnieją trzy przypadki, w których można uzyskać komunikat „Brak takiego pliku lub katalogu”:

  • Plik nie istnieje. Zakładam, że sprawdziłeś, czy plik istnieje (być może dlatego, że powłoka go uzupełnia).
  • Istnieje plik o tej nazwie, ale jest to wiszące łącze symboliczne.
  • Plik istnieje i możesz go nawet odczytać (na przykład polecenie file shank-linux-120720110-1-binwyświetla coś w stylu „32-bitowy plik ELF 32-bitowy plik LSB…”), a jednak, gdy próbujesz go uruchomić, usłyszysz, że plik nie istnieje.

Komunikat o błędzie w tym ostatnim przypadku jest wprawdzie mylący. Mówi ci to, że brakuje kluczowego elementu środowiska wykonawczego niezbędnego do uruchomienia programu. Niestety kanał, przez który zgłaszany jest błąd, ma miejsce tylko na kod błędu, a nie na te dodatkowe informacje, że tak naprawdę winne jest środowisko wykonawcze. Jeśli potrzebujesz wersji technicznej tego objaśnienia, przeczytaj komunikat „Nie znaleziono” podczas uruchamiania 32-bitowego pliku binarnego w 64-bitowym systemie .

fileKomenda powie, tylko co to jest binarny. Z kilkoma wyjątkami, możesz uruchomić plik binarny tylko dla architektury procesora, dla której jest twoja wersja Ubuntu. Głównym wyjątkiem jest to, że można uruchomić 32-bitowe (x86, aka IA32) pliki binarne na systemach 64-bitowych (amd64, aka x86_64).

W systemie Ubuntu do 11.04, aby uruchomić 32-bitowy plik binarny w 64-bitowej instalacji, musisz zainstalować ia32-libspakiet Zainstaluj ia32-libs . Może być konieczne zainstalowanie dodatkowych bibliotek (jeśli to zrobisz, otrzymasz wyraźny komunikat o błędzie).

Ponieważ 11.10 (oneiric) wprowadziło obsługę wielu ścieżek , możesz nadal instalować ia32-libs, ale możesz wybrać bardziej szczegółowe podejście, to wystarczy (oprócz każdej innej niezbędnej biblioteki).libc6-i386 Zainstaluj libc6-i386

Gilles
źródło
Dzięki za świetną odpowiedź, Gilles. Chociaż nie spotkałem się z tym problemem (jeszcze!), Odłożyłem twoją odpowiedź na przyszłość.
Jim C
Dziękujemy za wyczerpującą odpowiedź! Kosz na pliki, który pobrałem, był jedynym dostępnym w tym formacie (bin). Myślę więc, że jest dobry dla wszystkich architektur. Pobrałem również plik .deb dla mojej architektury (64-bitowy), ale z innym błędem. W tym momencie myślę, że na grę wpływają pewne błędy lub nie mogę jej zainstalować. Teraz próbuję pobrać libc6-i386 i nadal próbuję go zainstalować. Napiszę ponownie, jeśli nastąpią znaczące zmiany. Dziękuję za poświęcony czas.
Francesco
2
@Francesco Proszę opublikować rozwiązanie! Prawdopodobnie pomoże innym osobom próbującym uruchomić Shank na Ubuntu. Odpowiedź na własne pytanie jest całkowicie w porządku .
Gilles
1
Możesz użyć, lddaby sprawdzić, czy brakuje biblioteki. ldd kgio_ext.somoże powiedzieć coś takiego libruby.so.2.3 => not foundmiędzy innymi
EnabrenTane
1
Najwyraźniej istnieje inny scenariusz, w którym bash: ...some...path...: No such file or directorymoże się pojawić: po przeniesieniu pliku wykonywalnego. Bash wydaje się buforować ścieżki do plików wykonywalnych znalezionych w $ PATH; biegnij, hash -raby to wyczyścić. Zobacz: unix.stackexchange.com/a/5610/11352
akavel
53

64-bitowe systemy Ubuntu Multiarch

Postępuj zgodnie z tą odpowiedzią tylko wtedy, gdy wyniki file file-nameprogramów,

file-name: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

Aby uruchomić 32-bitowy plik wykonywalny w 64-bitowym systemie multi-arch Ubuntu, trzeba dodać i386architekturę, a także trzeba zainstalować libc6:i386, libncurses5:i386, libstdc++6:i386te trzy pakiety bibliotek.

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
Avinash Raj
źródło
Używałbym sudo do ostatniego polecenia: uruchomienie 32-bitowego pliku binarnego (oczywiście nie skompilowanego przez ciebie ani Ubuntu), ponieważ sudo może być ryzykowne. (no cóż, nawet jako non-root, co prawda)
alci
cokolwiek to może być w końcu, ale działa.
Avinash Raj
1
Należy zauważyć, że jeśli używasz CentOS lub RedHat, ta odpowiedź nie ma zastosowania. Z tego powodu został wyrzucony na kilka godzin.
omikes
1
Na Kali 2 64 bit musiałem tylko zainstalowaćlibselinux1:i386
Aralox
4

Instalując deb dla wersji 32-bitowej zdałem sobie sprawę, że brakuje mi niektórych bibliotek (oprócz ia32-libs i libc6). Najpierw rozwiązałem ten problem, wydając następujące polecenie:

sudo apt-get install -f          

Potem dostałem kolejny błąd:

Message: SDL_GL_LoadLibrary 
Error: Failed loading libGL.so.1

Oczywiście biblioteki te zostały poprawnie zainstalowane. Nie wchodząc w szczegóły musiałem ręcznie połączyć biblioteki. Uświadomiłem sobie, że dzięki Synaptic można również łatwiej zainstalować następujące pakiety:

libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.

Potem następnym problemem był czarny ekran podczas gry, który rozwiązałem, zastępując plik wykonywalny w / Shank / bin tym: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar .bz2 .

Mam nadzieję, że komuś się przyda. Jeśli potrzebujesz dodatkowej pomocy lub więcej informacji, skontaktuj się ze mną.

Francesco
źródło
3

Oto transkrypcja pokazująca nieco więcej na temat natury problemu i sposobu jego rozwiązania w wersji Ubuntu 16.04. Zauważ, że mimo iż fileraporty „dynamicznie połączone”, ldd„nie są dynamicznymi plikami wykonywalnymi”.

$ ./myprogram
bash: myprogram: No such file or directory

$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped

$ ldd myprogram
    not a dynamic executable

Po zainstalowaniu libc6: i386 wszystko zaczyna się poprawiać ...

$ sudo apt-get install libc6:i386 # the initial fix
...

$ ldd myprogram
    linux-gate.so.1 =>  (0xf77fd000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
    /lib/ld-linux.so.2 (0x56578000)

$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

Aby ukończyć zadanie, może być konieczne zidentyfikowanie i zainstalowanie dodatkowych bibliotek pojedynczo ...

$ sudo apt-get install libstdc++6:i386 ## may require various additional libs

$ ./myprogram
... works correctly ...

Nie wiem, czy istnieje systematyczny sposób identyfikowania poprawnych bibliotek do zainstalowania. Trochę zgadywania polega na odwzorowaniu komunikatów o błędach na nazwy pakietów (pomaga uzupełnienie tabulacji).

nobar
źródło
ldd(niepoprawnie) zgłasza „nie jest dynamicznym plikiem wykonywalnym”.
nobar
3

Aby rozwinąć odpowiedź @Gilles, istnieją co najmniej trzy scenariusze powodujące ten błąd:

  1. Plik nie istnieje.
  2. Plik istnieje, ale jest wiszącym dowiązaniem symbolicznym.
  3. Plik istnieje (np. filePolecenie działa), co powoduje, że pojawia się zagadkowy komunikat o błędzie. Może to oznaczać problem z modułem ładującym.

Kategorie problemów z modułem ładującym:

  1. Program ładujący plik wykonywalny nie istnieje. Możesz to sprawdzić za pomocą polecenia file i sprawdzić, czy moduł ładujący istnieje. Na przykład

    file lmgrd
    lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
    

    Zawiadomienie interpreter /lib64/ld-lsb-x86-64.so.3; jeśli ten plik nie istnieje, musisz go zainstalować. Odpowiedź dla tego konkretnego modułu ładującego w dniu 16.04 sudo apt-get install lsb.

  2. Problemy z modułem ładującym skrypt (zobacz tę odpowiedź ).

  3. Brak bibliotek współdzielonych - służy ldd <file-name>do sprawdzania, czy nie ma bibliotek „nie odnalezionych”. Zobacz tę odpowiedź, aby uzyskać więcej informacji.

Moduł ładujący nie istnieje może być spowodowany niedopasowaniem 32/64 bit lub z innego powodu. Mogą istnieć inne rodzaje błędów modułu ładującego, o których nie wiem.

jtpereyda
źródło
1
W moim przypadku file lmutilnie pokazałem tłumacza, ale lddzrobiłem to i instalacja lsbrozwiązała problem.
davidA