J'ai téléchargé un jeu (Shank) mais le fichier bin ne s'exécute pas. L'erreur affichée lorsque j'essaie de lancer l'exécutable est la suivante:
bash: ./shank-linux-120720110-1-bin: No such file or directory
Vous essayez probablement d'exécuter un binaire 32 bits sur un système 64 bits sur lequel le support 32 bits n'est pas installé.
Vous pouvez obtenir le message "Aucun fichier ou répertoire de ce type" dans trois cas:
file shank-linux-120720110-1-bin
affiche quelque chose du type "Exécutable ELF 32 bits LSB…"). Pourtant, lorsque vous essayez de l'exécuter, on vous dit que le fichier n'existe pas. .Le message d'erreur dans ce dernier cas est certes déroutant. Cela vous dit qu'il manque un composant clé de l'environnement d'exécution nécessaire à l'exécution du programme. Malheureusement, le canal par lequel l'erreur est signalée n'a de la place que pour le code d'erreur et non pour ces informations supplémentaires, à savoir que c'est vraiment l'environnement d'exécution qui est à blâmer. Si vous souhaitez connaître la version technique de cette explication, lisez le message Obtention du message “Introuvable” lors de l’exécution d’un fichier binaire 32 bits sur un système 64 bits .
La commande file
vous expliquera en quoi consiste ce binaire. À quelques exceptions près, vous ne pouvez exécuter qu'un binaire pour l'architecture de processeur à laquelle votre version d'Ubuntu est destinée. La principale exception est que vous pouvez exécuter des fichiers binaires 32 bits (x86, a.k. IA32) sur des systèmes 64 bits (AMD64, a.k.a.x86_64).
Dans Ubuntu jusqu’à la version 11.04, pour exécuter un fichier binaire 32 bits sur une installation 64 bits, vous devez installer le package ia32-libs
package . Vous devrez peut-être installer des bibliothèques supplémentaires (vous obtiendrez un message d'erreur explicite si vous le faites).
Depuis 11.10 (oneiric) introduit multiarch support, vous pouvez toujours installer ia32-libs
, mais vous pouvez choisir une approche plus fine, il suffit d’obtenir libc6-i386
(plus toute autre bibliothèque nécessaire).
Suivez cette réponse uniquement si le résultat de file file-name
s'affiche,
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
Pour exécuter un fichier exécutable 32 bits dans un système Ubuntu 64 bits à plusieurs archives, vous devez ajouter l'architecture i386
et installer le libc6:i386
, libncurses5:i386
, libstdc++6:i386
ces trois packages de bibliothèque.
Sudo dpkg --add-architecture i386
Sudo apt-get update
Sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
En installant le deb pour 32 bits, j'ai réalisé qu'il me manquait des bibliothèques (en plus de ia32-libs et de libc6). J'ai d'abord résolu ce problème en donnant cette commande:
Sudo apt-get install -f
Puis j'ai eu une autre erreur:
Message: SDL_GL_LoadLibrary
Error: Failed loading libGL.so.1
Évidemment, ces bibliothèques ont été correctement installées. Sans entrer dans les détails, je devais relier les bibliothèques à la main. J'ai alors réalisé que Synaptic pourrait également installer une solution plus simple:
libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.
Après cela, le problème suivant était l'écran noir pendant la lecture, que j'ai résolu en remplaçant l'exécutable dans/Shank/bin par ceci: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix -test.tar.bz2 .
J'espère que cela sera utile à quelqu'un. Si vous avez besoin de plus d'aide ou de plus de détails, n'hésitez pas à me contacter.
Voici une transcription montrant un peu plus sur la nature du problème et comment le résoudre à partir de Ubuntu 16.04. Notez que même si file
indique "lié dynamiquement", ldd
indique "pas un exécutable dynamique".
$ ./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
Une fois que vous avez installé libc6: i386, les choses commencent à s’améliorer ...
$ 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
Pour terminer le travail, vous devrez peut-être identifier et installer des bibliothèques supplémentaires, une à la fois ...
$ Sudo apt-get install libstdc++6:i386 ## may require various additional libs
$ ./myprogram
... works correctly ...
Je ne sais pas s'il existe un moyen systématique d'identifier les bonnes bibliothèques à installer. Il y a un peu de approximation qui mappe les messages d'erreur aux noms de paquet (la complétion par un onglet aide).
Pour développer la réponse @Gilles, il existe au moins trois scénarios entraînant cette erreur:
file
fonctionne, par exemple), ce qui en fait un message d'erreur déconcertant. Cela peut signifier qu'il y a un problème avec le chargeur.Catégories de problèmes de chargeur:
Le chargeur d'un exécutable n'existe pas. Vous pouvez vérifier cela en utilisant la commande file et voir si le chargeur existe. Par exemple.
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
Remarquez interpreter /lib64/ld-lsb-x86-64.so.3
; si ce fichier n'existe pas, vous devez l'installer. Pour ce chargeur particulier sur 16.04, la réponse s'est avérée être Sudo apt-get install lsb
.
Problèmes avec le chargeur d'un script (voir cette réponse ).
ldd <file-name>
pour rechercher les bibliothèques "non trouvées". Voir cette réponse pour plus d'informations.Le chargeur inexistant pourrait être dû à une non-concordance de 32/64 bits ou à une autre raison. Il y a peut-être d'autres types d'erreurs de chargement que je ne connais pas.