Bash ne sait rien d'ELF. Il voit simplement que vous lui avez demandé d'exécuter un programme externe, il passe donc le nom que vous lui avez donné tel quel execve(2)
. La connaissance de choses comme les formats de fichiers exécutables, les lignes de shebang et les autorisations d'exécution se trouve derrière cet appel système , dans le noyau.
(C'est la même chose pour les autres obus, bien qu'ils puissent choisir d'utiliser une autre fonction dans la exec(3)
famille à la place.)
Dans Bash 4.3, cela se produit à la ligne 5195 de execute_cmd.c
la shell_execve()
fonction.
Si vous voulez comprendre Linux au niveau du code source, je vous recommande de télécharger une copie de Research Unix V6 ou V7 , et de passer par là plutôt que toute la complexité des systèmes Linux modernes. Le Livre des Lions est un bon guide du code.
V7 est l'endroit où le shell Bourne a fait ses débuts. Tout son code source C est un peu plus de la moitié de la taille d'un seul fichier C dans Bash. La coque Thompson en V6 est presque la moitié de la taille de la coque Bourne d'origine. Pourtant, ces deux obus plus simples font le même genre de chose que Bash, et pour la même raison. (Il semble s'agir d'un execv(2)
appel provenant texec()
du shell Thompson et d'un execve()
appel provenant execs()
du service.c
module du shell Bourne .)