GNU/Linux >> Tutoriels Linux >  >> Linux

Vous obtenez le message "introuvable" lors de l'exécution d'un binaire 32 bits sur un système 64 bits ?

J'ai actuellement un problème étrange sur debian (wheezy/amd64).

J'ai créé un chroot pour installer un serveur (je ne peux pas donner plus de détails à ce sujet, désolé). Appelons son chemin /chr_path/ .
Pour faciliter les choses, j'ai initialisé ce chroot avec un debootstrap (aussi wheezy/amd64).

Tout semblait bien fonctionner à l'intérieur du chroot mais quand j'ai lancé le script d'installation de mon serveur j'ai obtenu :
zsh: Not found /some_path/perl (le programme d'installation inclut un binaire perl pour certaines raisons)

Naturellement, j'ai vérifié le /some_path/ emplacement et j'ai trouvé le binaire "perl". file dans l'environnement chroot renvoie :

/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped

Le fichier existe, semble correct, a les droits corrects. Je peux utiliser file , ls , vim dessus mais dès que j'essaie de l'exécuter - ./perl par exemple – j'obtiens :zsh: Not found ./perl .

Cette situation est tout à fait compréhensible pour moi. De plus :

  • Je peux exécuter d'autres binaires de base (/bin/ls,…) dans le chroot sans avoir d'erreurs
  • J'ai les mêmes problèmes avec d'autres fichiers binaires fournis avec le projet
  • Lorsque j'essaie d'exécuter le binaire à partir de la racine principale (/chr_path/some_path/perl ), ça marche.
  • J'ai essayé de mettre l'un des binaires avec une copie de mon ls . J'ai vérifié que les droits d'accès étaient les mêmes mais cela n'a rien changé (l'un fonctionnait, l'autre non)

Réponse acceptée :

Lorsque vous ne parvenez pas à exécuter un fichier qui dépend d'un "chargeur", l'erreur que vous obtenez peut faire référence au chargeur plutôt qu'au fichier que vous exécutez.

  • Le chargeur d'un exécutable natif lié dynamiquement est la partie du système responsable du chargement des bibliothèques dynamiques. C'est quelque chose comme /lib/ld.so ou /lib/ld-linux.so.2 , et doit être un fichier exécutable.
  • Le chargeur d'un script est le programme mentionné sur la ligne shebang, par ex. /bin/sh pour un script commençant par #!/bin/sh . (Bash et zsh donnent un message "bad interpreter" au lieu de "command not found" dans ce cas.)

Le message d'erreur est plutôt trompeur en n'indiquant pas que le chargeur est le problème. Malheureusement, résoudre ce problème serait difficile car l'interface du noyau n'a de place que pour signaler un code d'erreur numérique, pas pour indiquer également que l'erreur concerne en fait un fichier différent. Certains shells font le travail eux-mêmes pour les scripts (en lisant le #! ligne sur le script et retravailler la condition d'erreur), mais aucun que j'ai vu tenter de faire la même chose pour les binaires natifs.

ldd ne fonctionnera pas non plus sur les binaires car cela fonctionne en définissant des variables d'environnement spéciales, puis en exécutant le programme, laissant le chargeur faire le travail. strace ne fournirait aucune information significative non plus, car il ne rapporterait pas plus que ce que le noyau rapporte, et comme nous l'avons vu, le noyau ne peut pas rapporter tout ce qu'il sait.

Connexe :Comment déterminer la valeur optimale pour le paramètre bs à dd ?

Cette situation se produit souvent lorsque vous essayez d'exécuter un binaire pour le bon système (ou famille de systèmes) et la superarchitecture, mais la mauvaise sous-architecture. Ici, vous avez des binaires ELF sur un système qui attend des binaires ELF, donc le noyau les charge parfaitement. Ce sont des binaires i386 exécutés sur un processeur x86_64, donc les instructions ont un sens et amènent le programme au point où il peut rechercher son chargeur. Mais le programme est un programme 32 bits (comme le file sortie indique), à ​​la recherche du chargeur 32 bits /lib/ld-linux.so.2 , et vous n'avez probablement installé que le chargeur 64 bits /lib64/ld-linux-x86-64.so.2 dans le chroot.

Vous devez installer le système d'exécution 32 bits dans le chroot :le chargeur et toutes les bibliothèques dont les programmes ont besoin. À partir de Debian Wheezy, si vous souhaitez à la fois le support i386 et x86_64, commencez par une installation amd64 et activez le support multiarch :exécutez dpkg --add-architecture i386 puis apt-get update et apt-get install libc6:i386 zlib1g:i386 … (si vous souhaitez générer une liste des dépendances du paquet perl de Debian, pour voir quelles bibliothèques sont susceptibles d'être nécessaires, vous pouvez utiliser aptitude search -F %p '~Rdepends:^perl$ ~ri386' ). Vous pouvez extraire une collection de bibliothèques communes en installant le ia32-libs package (vous devez d'abord activer le support multiarch). Sur Debian amd64 jusqu'à wheezy, le chargeur 32 bits est dans la libc6-i386 emballer. Vous pouvez installer un plus grand ensemble de bibliothèques 32 bits en installant ia32-libs .


Linux
  1. Comment conserver la propriété et les autorisations de fichiers intactes lors de la copie de fichiers ou de répertoires

  2. Les utilitaires Linux sont-ils intelligents lors de l'exécution de commandes canalisées ?

  3. Décompresser un fichier .gz pour obtenir un fichier texte mais obtenir un fichier binaire ? ?

  4. Quand reçoit-on le message d'erreur "jobs :Not Found" ?

  5. Exécuter une application 32 bits sous Linux 64 bits ?

5 façons de trouver une description et un emplacement de "commande binaire" sur le système de fichiers

Comment vérifier que le système Linux est 32 bits ou 64 bits ?

Comment déterminer si un fichier binaire Linux est 32 bits ou 64 bits ?

Exécutez une application 64 bits sur un système Ubuntu 32 bits

Exécution d'un script bash ou d'un binaire c sur un système de fichiers avec l'option noexec

Obtention de l'erreur :bash :./programme :impossible d'exécuter le fichier binaire :erreur de format Exec