Es gibt 3 Arten von Objektdateien.
Verschiebbare Objektdateien
Enthält Maschinencode in einer Form, die zur Verknüpfungszeit mit anderen verschiebbaren Objektdateien kombiniert werden kann, um eine ausführbare Objektdatei zu bilden.
Wenn Sie eine a.c
Quelldatei haben, sollten Sie Folgendes ausführen, um die Objektdatei mit GCC zu erstellen:
gcc a.c -c
Der vollständige Prozess wäre: Präprozessor (cpp) würde über Wechselstrom laufen. Seine Ausgabe (noch Quelle) wird in den Compiler (cc1) eingespeist. Seine Ausgabe (Assembly) wird in den Assembler (as) eingespeist, der die erzeugt relocatable object file
. Diese Datei enthält Objektcode und Verknüpfung (und Debugging, wenn-g
verwendet) und ist nicht direkt ausführbar.
Freigegebene Objektdateien
Spezieller Typ einer verschiebbaren Objektdatei, die entweder zur Ladezeit oder zur Laufzeit dynamisch geladen werden kann. Gemeinsame Bibliotheken sind ein Beispiel für diese Art von Objekten.
Ausführbare Objektdateien
Enthält Maschinencode, der direkt in den Speicher geladen werden kann (vom Loader, z. B. execve ) und anschließend ausgeführt werden kann.
Das Ergebnis des Ausführens des Linkers über mehrere relocatable object files
ist ein executable object file
. Der Linker führt alle Eingabeobjektdateien über die Befehlszeile von links nach rechts zusammen, indem alle Eingabeabschnitte desselben Typs (z. B. .data
) mit dem Ausgabeabschnitt desselben Typs zusammengeführt werden. Es verwendet symbol resolution
undrelocation
.
Bonus gelesen:
Beim Verknüpfen mit a werden static library
die Funktionen, auf die in den Eingabeobjekten verwiesen wird, in die endgültige ausführbare Datei kopiert. Mit dynamic libraries
einer Symboltabelle stattdessen erstellt wird , dass ein dynamische mit der Bibliothek Funktionen / Globals Verknüpfung aktivieren. Das Ergebnis ist also eine teilweise ausführbare Objektdatei, da dies von der Bibliothek abhängt. Wenn die Bibliothek nicht vorhanden ist, kann die Datei nicht mehr ausgeführt werden.
Der Verknüpfungsprozess kann wie folgt durchgeführt werden:
ld a.o -o myexecutable
Der Befehl: gcc a.c -o myexecutable
ruft alle unter Punkt 1 und Punkt 3 genannten Befehle auf (cpp -> cc1 -> as -> ld 1 )
1: ist eigentlich collect2, was ein Wrapper über ld ist.