3 Stimmen

Prozess des Ausführens von Linux ausführbar

Gibt es eine gute Dokumentation darüber, was passiert, wenn ich eine ausführbare Datei in Linux ausführe? Zum Beispiel: Ich starte ./a.out, also wird wahrscheinlich etwas Bootloader-Assembly ausgeführt (mit C-Laufzeit?), und es findet das Startsymbol im Programm, führt dynamische Umplatzierung durch und ruft schließlich main auf.

Ich weiß, dass das oben Genannte nicht korrekt ist, aber ich suche nach einer detaillierten Dokumentation darüber, wie dieser Prozess abläuft. Können Sie bitte erklären oder auf Links oder Bücher verweisen, die dies tun?

5voto

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.

1voto

Summer_More_More_Tea Punkte 12062

Ein Buch "Linker und Loader" gibt eine ausführliche Beschreibung des Ladevorgangs. Vielleicht kann es dir bei dem Problem helfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X