Ich lese über Bibliotheken in C, habe aber noch keine Erklärung gefunden, was eine Objektdatei ist. Was ist der wirkliche Unterschied zwischen einer anderen kompilierten Datei und einer Objektdatei?
Ich würde mich freuen, wenn jemand in menschlicher Sprache erklären könnte.
c
compilation
linker
object-files
Pithikos
quelle
quelle
Antworten:
Eine Objektdatei ist die eigentliche Ausgabe der Kompilierungsphase. Es handelt sich hauptsächlich um Maschinencode, enthält jedoch Informationen, mit denen ein Linker sehen kann, welche Symbole darin enthalten sind und welche Symbole für die Arbeit erforderlich sind. (Als Referenz sind "Symbole" im Grunde Namen von globalen Objekten, Funktionen usw.)
Ein Linker nimmt alle diese Objektdateien und kombiniert sie zu einer ausführbaren Datei (vorausgesetzt, dies ist möglich, dh es gibt keine doppelten oder undefinierten Symbole). Viele Compiler erledigen dies für Sie (lesen Sie: Sie führen den Linker selbst aus), wenn Sie ihnen nicht sagen, dass sie nur mit Befehlszeilenoptionen "kompilieren" sollen. (
-c
ist eine übliche Option "nur kompilieren; nicht verknüpfen".)quelle
Eine Objektdatei ist die kompilierte Datei selbst. Es gibt keinen Unterschied zwischen den beiden.
Eine ausführbare Datei wird durch Verknüpfen der Objektdateien gebildet.
Die Objektdatei enthält Anweisungen auf niedriger Ebene, die von der CPU verstanden werden können. Deshalb wird es auch Maschinencode genannt.
Dieser Maschinencode auf niedriger Ebene ist die binäre Darstellung der Anweisungen, die Sie auch direkt in Assemblersprache schreiben und dann den Assemblersprachencode (in Englisch dargestellt) mit einem Assembler in Maschinensprache (in Hex dargestellt) verarbeiten können.
Hier ist ein typischer Ablauf auf hoher Ebene für diesen Prozess für Code in einer höheren Sprache wie C.
-> geht durch Vorprozessor
-> um optimierten Code zu geben, immer noch in C.
-> geht durch Compiler
-> um Assembler-Code zu geben
-> geht durch einen Assembler
-> Code in Maschinensprache geben, der in OBJECT FILES gespeichert ist
-> geht durch Linker
-> um eine ausführbare Datei zu erhalten.
Dieser Ablauf kann einige Variationen aufweisen, z. B. können die meisten Compiler den Maschinensprachencode direkt generieren, ohne einen Assembler zu durchlaufen. Ebenso können sie die Vorverarbeitung für Sie durchführen. Trotzdem ist es schön, die Bestandteile zum besseren Verständnis aufzuteilen.
quelle
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 einexecutable 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 verwendetsymbol 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. Mitdynamic 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.
quelle
Eine Objektdatei ist genau das, was Sie erhalten, wenn Sie eine (oder mehrere) Quelldatei (en) kompilieren.
Es kann sich entweder um eine vollständig ausgefüllte ausführbare Datei oder Bibliothek oder um Zwischendateien handeln.
Die Objektdateien enthalten normalerweise systemeigenen Code, Linkerinformationen, Debugging-Symbole usw.
quelle
Objektdateien sind Codes, die von Funktionen, Symbolen und Text abhängig sind, um das Programm auszuführen. Genau wie bei alten Fernschreibgeräten, bei denen eine Teletypisierung erforderlich war, um Signale an andere Fernschreibgeräte zu senden.
Ebenso wie Prozessoren zum Ausführen Binärcode benötigen, sind Objektdateien wie Binärcode, jedoch nicht verknüpft. Durch das Verknüpfen werden zusätzliche Dateien erstellt, sodass der Benutzer die C-Sprache nicht selbst kompilieren muss. Benutzer können die exe-Datei direkt öffnen, sobald die Objektdatei mit einem Compiler wie c language oder vb usw. verknüpft ist.
quelle