Ho scaricato un gioco (Shank) ma il file bin non viene eseguito. L'errore che viene visualizzato quando provo ad avviare l'eseguibile è:
bash: ./shank-linux-120720110-1-bin: No such file or directory
Ho scaricato un gioco (Shank) ma il file bin non viene eseguito. L'errore che viene visualizzato quando provo ad avviare l'eseguibile è:
bash: ./shank-linux-120720110-1-bin: No such file or directory
Risposte:
Probabilmente stai cercando di eseguire un binario a 32 bit su un sistema a 64 bit in cui non è installato il supporto a 32 bit.
Esistono tre casi in cui è possibile ottenere il messaggio "Nessun file o directory":
file shank-linux-120720110-1-bin
visualizza qualcosa come "eseguibile LSB a 32 bit ELF ..."), eppure quando tenti di eseguirlo ti viene detto che il file non esiste.Il messaggio di errore in quest'ultimo caso è certamente confuso. Quello che ti dice è che manca un componente chiave dell'ambiente di runtime necessario per eseguire il programma. Sfortunatamente, il canale attraverso il quale viene segnalato l'errore ha solo spazio per il codice di errore e non per queste informazioni extra che è la colpa dell'ambiente di runtime. Se si desidera la versione tecnica di questa spiegazione, leggere Come ottenere il messaggio "Non trovato" quando si esegue un file binario a 32 bit su un sistema a 64 bit .
Il file
comando ti dirà che cos'è questo binario. Con poche eccezioni, è possibile eseguire solo un binario per l'architettura del processore per cui è prevista la versione di Ubuntu. L'eccezione principale è che è possibile eseguire binari a 32 bit (x86, aka IA32) su sistemi a 64 bit (amd64, aka x86_64).
In Ubuntu fino alla 11.04, per eseguire un file binario a 32 bit su un'installazione a 64 bit, è necessario installare il ia32-libs
pacchetto . Potrebbe essere necessario installare librerie aggiuntive (in tal caso riceverai un messaggio di errore esplicito).
Da quando l'11.10 (onirico) ha introdotto il supporto multiarch , è ancora possibile installare ia32-libs
, ma è possibile scegliere un approccio più fine, che è sufficiente per ottenere (oltre a qualsiasi altra libreria necessaria).libc6-i386
ldd
per verificare se ti manca una libreria. ldd kgio_ext.so
potrebbe dire qualcosa di simile libruby.so.2.3 => not found
tra gli altri
bash: ...some...path...: No such file or directory
può apparire: dopo aver spostato il file eseguibile. Bash sembra memorizzare nella cache i percorsi degli eseguibili trovati in $ PATH; corri hash -r
per cancellarlo. Vedi: unix.stackexchange.com/a/5610/11352
Segui questa risposta solo se l'output di file file-name
spettacoli,
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
Per eseguire file eseguibile a 32 bit in un ambiente multi-arch sistema Ubuntu a 64 bit, è necessario aggiungere i386
l'architettura e anche necessario installare libc6:i386
, libncurses5:i386
, libstdc++6:i386
questi tre pacchetti di libreria.
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
libselinux1:i386
Installando il deb per 32 bit mi sono reso conto che mancavano alcune librerie (oltre a ia32-libs e libc6). Ho prima risolto questo problema dando questo comando:
sudo apt-get install -f
Quindi ho ricevuto un altro errore:
Message: SDL_GL_LoadLibrary
Error: Failed loading libGL.so.1
Ovviamente, queste librerie sono state installate correttamente. Senza entrare nei dettagli ho dovuto collegare le librerie a mano. Mi sono reso conto quindi che una soluzione più semplice tramite Synaptic poteva installare i seguenti pacchetti:
libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.
Successivamente il problema successivo è stato lo schermo nero durante la riproduzione, che ho risolto sostituendo l'eseguibile in / Shank / bin con questo: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar .bz2 .
Spero che sia utile a qualcuno. Se hai bisogno di ulteriore aiuto o maggiori dettagli, non esitare a contattarmi.
Ecco una trascrizione che mostra un po 'di più sulla natura del problema e su come risolverlo a partire da Ubuntu 16.04. Si noti che anche se i file
report "sono collegati dinamicamente", i ldd
report "non sono eseguibili dinamici".
$ ./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
Una volta installato libc6: i386, le cose iniziano a migliorare ...
$ 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
Per completare il lavoro, potrebbe essere necessario identificare e installare librerie aggiuntive una alla volta ...
$ sudo apt-get install libstdc++6:i386 ## may require various additional libs
$ ./myprogram
... works correctly ...
Non so se esiste un modo sistematico per identificare le librerie corrette da installare. C'è un po 'di congetture che mappano i messaggi di errore sui nomi dei pacchetti (il completamento della scheda aiuta).
ldd
(erroneamente) riporta "non un eseguibile dinamico".
Per espandere la risposta @Gilles, ci sono almeno tre scenari con questo errore:
file
comando funziona), creando un messaggio di errore sconcertante. Ciò può significare che c'è un problema con il caricatore.Categorie di problemi del caricatore:
Il caricatore di un eseguibile non esiste. Puoi verificarlo usando il comando file e vedere se il caricatore esiste. Per esempio
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
Avviso interpreter /lib64/ld-lsb-x86-64.so.3
; se questo file non esiste, è necessario installarlo. Per questo particolare caricatore del 16.04, la risposta si è rivelata essere sudo apt-get install lsb
.
Problemi con il caricatore di uno script (vedi questa risposta ).
ldd <file-name>
per verificare la presenza di librerie "non trovate". Vedi questa risposta per maggiori informazioni.Il caricatore inesistente potrebbe essere dovuto a una mancata corrispondenza a 32/64 bit o ad altri motivi. Potrebbero esserci altri tipi di errori del caricatore che non conosco.
file lmutil
non ho mostrato l'interprete, ma l' ldd
ho fatto e l'installazione ha lsb
risolto il problema.