web-dev-qa-db-fra.com

Aucun fichier ou répertoire de ce nom? Mais le fichier existe!

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
176
Francesco

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:

  • Le fichier n'existe pas. Je suppose que vous avez vérifié que le fichier existe (peut-être parce que le shell le complète).
  • Il existe un fichier portant ce nom, mais il s’agit d’un lien symbolique pendant.
  • Le fichier existe et vous pouvez même le lire (par exemple, la commande 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 packageInstall ia32-libs . 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-i386Install libc6-i386 (plus toute autre bibliothèque nécessaire).

223
Gilles

Systèmes Multiarch Ubuntu 64 bits

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
50
Avinash Raj

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.

4
Francesco

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).

3
nobar

Pour développer la réponse @Gilles, il existe au moins trois scénarios entraînant cette erreur:

  1. Le fichier n'existe pas.
  2. Le fichier existe mais est un lien symbolique pendant.
  3. Le fichier existe (la commande 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:

  1. 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 .

  2. Problèmes avec le chargeur d'un script (voir cette réponse ).

  3. Bibliothèques partagées manquantes - utilisez 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.

2
jtpereyda