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:
-Wl,--dynamic-linker=/lib/ld-linux.so.2