Comment bash exécute-t-il un fichier ELF?

8

Quand je suis sur ma Linux Box, j'utilise bash comme shell. Maintenant, je me demandais comment bash gère l'exécution d'un fichier ELF, c'est-à-dire quand je tape ./program et que program est un fichier ELF. J'ai salué le bash-4.3.tar.gz, il ne semble pas y avoir une sorte d'analyseur de nombres magiques pour savoir si le fichier est un ELF ni trouver un appel système exec ().

Comment fonctionne le processus? Comment bash passe-t-il l'exécution de l'ELF au système d'exploitation?

JohnnyFromBF
la source

Réponses:

15

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.cla 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 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.cmodule du shell Bourne .)

Warren Young
la source