GNU/Linux >> Tutoriels Linux >  >> Linux

"Aucun fichier ou répertoire de ce type" ne se trouve sur les binaires installés par Optware ?

J'utilise Optware pour installer des packages sur mon NAS basé sur ARM depuis un certain temps - les éléments habituels comme Transmission, Samba et autres. Cependant, j'avais eu des problèmes avec la transmission suspendue peu de temps après le démarrage. J'ai cherché une solution pendant un moment et j'ai finalement découvert que le flux Optware que j'utilisais n'était pas celui qui avait été configuré pour mon boîtier NAS. J'ai changé les flux et réinstallé tous les packages, mais j'obtiens maintenant l'erreur suivante lorsque j'essaie d'exécuter tout ce qui a été réinstallé :

$ smbd
-bash: /opt/sbin/smbd: No such file or directory
$ transmission-daemon
-bash: /opt/bin/transmission-daemon: No such file or directory
$ unrar
-bash: /opt/bin/unrar: No such file or directory

J'ai vérifié /opt/bin et /opt/sbin et les exécutables sont définitivement là - alors quel est le vrai problème ?

$ ldd /opt/bin/transmission-daemon
/usr/bin/ldd: line 116: /opt/bin/transmission-daemon: No such file or directory

$ file /opt/bin/transmission-daemon
/opt/bin/transmission-daemon: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), stripped

$ readelf - l /opt/sbin/smbd
readelf: error while loading shared libraries: libc.so.0: cannot open shared object file: No such file or directory

$ cat /proc/$$/maps
…
40084000-4019e000 r-xp 00000000 09:01 112594 /lib/libc-2.7.so
…

Je ne suis pas sûr de ce que cela signifie, mais cela prouve que le fichier est là, non ? Ou est-ce quelque chose à voir avec les bibliothèques partagées ?

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 .

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 fonctionne pas non plus sur les binaires car il 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.

Voici vos exécutables réinstallés (smbd , transmission-daemon , etc.) demandent un chargeur qui n'est pas présent sur votre système. Votre nouveau flux n'est donc pas non plus adapté à votre système.

Connexe :Linux – Ajuster la vitesse du ventilateur via Fancontrol en fonction de la température du disque dur (Hddtemp) ?

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 ARM exécutés sur un processeur ARM, donc les instructions ont un sens et amènent le programme au point où il peut rechercher son chargeur. Mais ce n'est pas le bon chargeur.

Maintenant, je me lance dans des conjectures, mais je soupçonne que votre nouveau flux est destiné au mauvais ARM ABI. L'ABI est le langage commun pour effectuer des appels inter-procédures, et en particulier pour appeler des fonctions de bibliothèque. Sur certaines architectures de processeur, il existe plusieurs choix d'ABI possibles, et vous devez en choisir un et l'utiliser de manière cohérente. Il existe deux ABI ARM avec des distributions Linux :le traditionnel arm-elf ABI, et le plus récent EABI (arm-eabi ). Vous ne pouvez pas mélanger les ABI sur le même système, vous devez donc trouver une source de packages pour votre ABI (ou réinstaller votre système pour un autre ABI).


Linux
  1. Impossible d'exécuter un tel fichier ou répertoire [Réparer]

  2. Python - Aucun fichier ou répertoire de ce type, mais je peux le voir ! ?

  3. Faire en sorte que Ls distingue les scripts des fichiers binaires dans la sortie ?

  4. Expliquer "-bash :aucun fichier ou répertoire de ce type" ?

  5. Alsamixer renvoie "impossible d'ouvrir le mélangeur :aucun fichier ou répertoire de ce type" ?

Mkdir :impossible de créer un répertoire :aucun fichier ou répertoire de ce type ?

Impossible d'exécuter la commande de configuration :"aucun fichier ou répertoire de ce type" ?

Impossible de supprimer le fichier sur la partition Ntfs, événement en tant que racine ?

Shopt :introuvable [aucun fichier ou répertoire de ce type]

Bash :Aucun fichier ou répertoire de ce type ?

sys/types.h :aucun fichier ou répertoire de ce type