Für dynamisch verknüpfte Programme erkennt der Kernel den PT_INTERP
Header in der ELF-Datei und mappt zuerst den dynamischen Linker (/lib/ld-linux.so.2
oder ähnlich) ein und startet die Ausführung an der e_entry
-Adresse des Haupt-ELF-Headers des dynamischen Linkers. Der anfängliche Zustand des Stacks enthält die Informationen, die der dynamische Linker benötigt, um das Hauptprogramm-Binary (das bereits im Speicher ist) zu finden. Er ist dafür verantwortlich, dies zu lesen und alle zusätzlichen Bibliotheken zu finden, die geladen werden müssen, sie zu laden, Relokationen durchzuführen und zur e_entry
-Adresse des Hauptprogramms zu springen.
Für statisch verknüpfte Programme verwendet der Kernel direkt die e_entry
-Adresse aus dem Haupt-ELF-Header des Hauptprogramms.
In jedem Fall beginnt das Hauptprogramm mit einer Routine, die traditionell in Assembler geschrieben ist und normalerweise _start
genannt wird (aber der Name ist nicht wichtig, solange seine Adresse im e_entry
-Feld des ELF-Headers liegt). Es verwendet den anfänglichen Stack-Inhalt, um argc
, argv
, environ
usw. zu bestimmen und ruft die richtigen implementierungsinternen Funktionen (normalerweise in C geschrieben) auf, um globale Konstruktoren auszuführen (falls vorhanden) und alle libc-Initialisierung durchzuführen, die vor dem Eintritt in main
erforderlich ist. Dies endet normalerweise mit einem Aufruf von exit(main(argc, argv));
oder äquivalent.