Frage

Ich habe schon immer verwirrt darüber, wie die Linker funktionieren, und es ist ein schwieriges Thema suchen.

meine Frage Um zu demonstrieren, und einen Rahmen für eine Antwort zu geben, ich werde hinstellen, was ich weiß (oder glaube, ich weiß) so weit. Ich kann sehr falsch sein. :)

Als erstes wird jede CPP-Datei in eine Zwischendatei gebaut (für Posix / ELF .o und .obj für Win / PE glaube ich). Diese Zwischendatei enthält alle Symbole, die von der CPP definiert es aus gebaut und hat Anweisungen für das, was externe Links muss es richtig gelöst werden. Als Erweiterung dazu Posix-Systeme können Sie die .o-Dateien in eine .a-Datei kombinieren (was nichts mehr zu tun scheint, als kombinieren? Welcher Befehl tut das?). Ist LIB die Win / PE-Äquivalent der Posix .a-Datei?

Als nächstes werden die Zwischendateien miteinander verbunden sind, externe Abhängigkeiten aufgelöst, und Sie haben Ihre ausführbare Datei. Bin ich irgendwelche Schritte fehlt?

Danke!

War es hilfreich?

Lösung

Hier ist ein paar Stücke des Puzzles:

  • ar (1) verwendet wird .a-Dateien zu erstellen. Sie sind ähnlich wie tar (1) oder ZIP-Dateien (evtl. mit einem Index eine Objektdatei mit Symbolnamen suchen)
  • Die Linker Kopien zusammen die Abschnitte von Objektdateien (Text, Daten, bss). Für GNU ld kann das genaue Kopieren von Abschnitten mit einer Linker-Skript gesteuert werden (z kopiert alle Abschnitte von .o Dateien „Text“ in ihrem Namen in einen einzigen Textteil enthalten)
  • Der Linker auch tut Verlagerungen: Patchen Anweisungen (Sprung und Datenlast) mit den jeweiligen Zieladressen, sobald der Wert eines Symbols bekannt ist. In einigen Fällen kann dies nicht in Verbindung Zeit durchgeführt werden, so dass die Linker-Kopien / stellen die Verlagerung Datensätze aus den .o Dateien in die endgültige ausführbaren Datei.
  • die Fenster LIB dient zwei Zwecken: eine statische Bibliothek (LIB) ist ähnlich wie .a Bibliotheken. Eine Importbibliothek (LIB) enthält nicht den eigentlichen Code, sondern nur Symbollisten. Der Linker kann Symbole aus der Importbibliothek lösen, aber dann weiß, dass es einen Verweis auf die entsprechende DLL in die ausführbaren Datei setzen muss. Unter Unix / ELF hat die .so-Datei sowohl den Code und die Symboltabelle.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top