Wie führt bash eine ELF-Datei aus?

8

Wenn ich auf meiner Linux Box bin, benutze ich Bash als Shell. Jetzt habe ich mich gefragt, wie bash mit der Ausführung einer ELF-Datei umgeht, wenn ich ./program eingebe und program eine ELF-Datei ist. Ich habe die bash-4.3.tar.gz gepackt, es scheint keinen magischen Zahlenparser zu geben, um herauszufinden, ob es sich bei der Datei um eine ELF handelt, und ich habe auch keinen exec () - Syscall gefunden.

Wie funktioniert der Prozess? Wie übergibt bash die Ausführung des ELF an das Betriebssystem?

JohnnyFromBF
quelle

Antworten:

15

Bash weiß nichts über ELF. Es wird lediglich angezeigt, dass Sie es aufgefordert haben, ein externes Programm auszuführen, sodass der Name, dem Sie es gegeben haben, unverändert übergeben wird execve(2). Das Wissen über Dinge wie ausführbare Dateiformate, Shebang-Zeilen und Ausführungsberechtigungen steckt hinter diesem Systemaufruf im Kernel.

(Dies gilt auch für andere Shells, obwohl sie möglicherweise exec(3)stattdessen eine andere Funktion in der Familie verwenden.)

In Bash 4.3 geschieht dies in Zeile 5195 execute_cmd.cder shell_execve()Funktion.

Wenn Sie Linux auf der Ebene des Quellcodes verstehen möchten, empfehle ich, eine Kopie von Research Unix V6 oder V7 herunterzuladen und diese durchzugehen , anstatt die Komplexität der modernen Linux-Systeme. Das Lions-Buch ist eine gute Anleitung zum Code.

In V7 feierte die Bourne-Shell ihr Debüt. Der gesamte C-Quellcode ist etwas mehr als halb so groß wie die eine C-Datei in Bash. Die Thompson-Shell in V6 ist fast halb so groß wie die ursprüngliche Bourne-Shell. Diese beiden einfacheren Muscheln machen jedoch dasselbe wie Bash und aus demselben Grund. (Es scheint sich um einen execv(2)Anruf aus texec()der Thompson-Shell und einen execve()Anruf aus execs()dem service.cModul der Bourne-Shell zu handeln .)

Warren Young
quelle