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
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
Odpowiedzi:
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”:
file shank-linux-120720110-1-bin
wyś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 .
file
Komenda 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-libs
pakiet . 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
ldd
aby sprawdzić, czy brakuje biblioteki. ldd kgio_ext.so
może powiedzieć coś takiego libruby.so.2.3 => not found
między innymi
bash: ...some...path...: No such file or directory
może się pojawić: po przeniesieniu pliku wykonywalnego. Bash wydaje się buforować ścieżki do plików wykonywalnych znalezionych w $ PATH; biegnij, hash -r
aby to wyczyścić. Zobacz: unix.stackexchange.com/a/5610/11352
Postępuj zgodnie z tą odpowiedzią tylko wtedy, gdy wyniki file file-name
programó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ć i386
architekturę, a także trzeba zainstalować libc6:i386
, libncurses5:i386
, libstdc++6:i386
te 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
libselinux1:i386
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ą.
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ż file
raporty „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).
ldd
(niepoprawnie) zgłasza „nie jest dynamicznym plikiem wykonywalnym”.
Aby rozwinąć odpowiedź @Gilles, istnieją co najmniej trzy scenariusze powodujące ten błąd:
file
Polecenie 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:
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
.
Problemy z modułem ładującym skrypt (zobacz tę odpowiedź ).
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.
file lmutil
nie pokazałem tłumacza, ale ldd
zrobiłem to i instalacja lsb
rozwiązała problem.