Erreur “sh: ./ introuvable” lors de l’exécution d’un fichier

J’ai rencontré un problème le plus étrange que j’ai jamais rencontré. Je comstack une application pour le processeur ARM avec Linux intégré. J’utilise buildroot , et tout se passe bien jusqu’à ce que j’essaye d’exécuter l’application sur la cible: je reçois -sh: ./hw: not found . Par exemple:

 $ cat /tmp/test.cpp #include  #include  int main(int argc, char** argv){ printf("Hello Kitty!\n"); return 0; } $ ./arm-linux-g++ -march=armv7-a /tmp/test.cpp -o /tftpboot/hw 

charger l’exécutable dans la cible; puis émettant sur la cible:

 # ./hw -sh: ./hw: Permission denied # chmod +x ./hw # ./hw -sh: ./hw: not found # ls -l ./hw -rwxr-xr-x 1 root root 6103 Jan 1 03:40 ./hw 

Il y a plus à faire: lors de la construction avec le compilateur distro, comme arm-linux-gnueabi-g++ -march=armv7-a /tmp/test.cpp -o /tftpboot/hw , l’application fonctionne bien!

J’ai comparé les exécutables à travers readelf -a -W /tftpboot/hw , mais je n’ai pas remarqué beaucoup de différence. J’ai collé les deux sorties ici . La seule chose que j’ai remarquée, ce sont les lignes Version5 EABI, soft-float ABI vs Version5 EABI . J’ai essayé de supprimer la différence en passant soit -mfloat-abi=softfp et -mfloat-abi=soft , mais le compilateur semble l’ignorer. Je suppose que cela n’a pas vraiment d’importance, car le compilateur ne le fait même pas.

J’ai aussi pensé, peut-être que sh génère cette erreur si un exécutable est incompatible d’une certaine manière. Mais sur mon PC hôte, je vois une autre erreur dans ce cas, par exemple:

 $ sh /tftpboot/hw /tftpboot/hw: 1: /tftpboot/hw: Syntax error: word unexpected (expecting ")") 

sh affiche cette erreur étrange car elle tente d’exécuter votre programme en tant que script shell !

Votre erreur ./hw: not found est probablement due au fait que l’éditeur de liens dynamic (interpréteur AKA ELF) n’est pas trouvé. Essayez de le comstackr en tant que programme statique avec -static ou en l’exécutant avec votre chargeur dynamic: # /lib/ld-linux.so.2 ./hw ou quelque chose du genre.

Si le problème est que le chargeur dynamic est nommé différemment dans votre chaîne d’outils et dans votre environnement d’exécution, vous pouvez le résoudre:

  • Dans l’environnement d’exécution: avec un lien symbolique.
  • Dans la chaîne d’outils: utilisez -Wl,--dynamic-linker=/lib/ld-linux.so.2