Was ist eine Objektdatei in C?

139

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.

Pithikos
quelle
Eine aktivere Version davon: stackoverflow.com/questions/12122446/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

Antworten:

152

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. ( -cist eine übliche Option "nur kompilieren; nicht verknüpfen".)

cHao
quelle
Tatsächlich ist bei den meisten Compilern die Ausgabe aus der Kompilierungsphase Assembler-Code, und der Compiler ruft dann den Assembler auf, um daraus eine Objektdatei zu machen.
Chris Dodd
15
@ChrisDodd: Das war bei älteren Compilern oft der Fall. Heutzutage generiert ein Compiler nur dann Assembler-Code, wenn Sie ihn dazu auffordern, und verwendet ihn häufig nicht intern. In beiden Fällen wäre die Assemblierung eine Unterphase der Kompilierungsphase, also ist alles umstritten.
CHao
2
Kann eine einzelne Objektdatei ausführbar sein?
Honey
1
@Honey: Im Allgemeinen nein. Selbst wenn die Objektdatei in einem Format ausgeführt wurde, das für die Ausführung vorgesehen ist (was im Grunde genommen nie der Fall ist), macht dieser Teil über "Symbole, die zum Arbeiten erforderlich sind" den Deal im Grunde zunichte. Sogar Ihre Standard "Hallo Welt" erfordert die Verknüpfung mit einer C-Laufzeitbibliothek.
CHao
74
  1. Eine Objektdatei ist die kompilierte Datei selbst. Es gibt keinen Unterschied zwischen den beiden.

  2. Eine ausführbare Datei wird durch Verknüpfen der Objektdateien gebildet.

  3. Die Objektdatei enthält Anweisungen auf niedriger Ebene, die von der CPU verstanden werden können. Deshalb wird es auch Maschinencode genannt.

  4. 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.

RHT
quelle
5
Der optimierte Code wird weder in der Vorprozessorphase noch unmittelbar danach generiert. Pre-Prozessor befasst sich nur mit seiner eigenen Sprache und das wars. Die Optimierung erfolgt in der Kompilierungs- und Montagephase.
Ignas2526
Entspricht die Objektdatei, die wir nach dem Kompilieren erhalten, der ausführbaren Datei in Maschinensprache? Ich bin verwirrt, weil Sie sagten, dass die Objektdatei im zweiten Schritt aus dem letzten erstellt wird und der letzte Schritt die ausführbare Datei ist. Ist die .0-Datei, die wir nach dem Kompilieren erhalten, die ausführbare Datei?
AV94
Kann eine einzelne Objektdatei nicht auch ausführbar sein?
Honey
33

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.cQuelldatei 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 filesist 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 resolutionundrelocation .

Bonus gelesen:

Beim Verknüpfen mit a werden static librarydie Funktionen, auf die in den Eingabeobjekten verwiesen wird, in die endgültige ausführbare Datei kopiert. Mit dynamic librarieseiner 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 myexecutableruft 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.

Paschalis
quelle
11

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.

Matte
quelle
2

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.

Farhan
quelle