Was ist eine Objektdatei in C?

Lesezeit: 6 Minuten

Benutzeravatar von Pithikos
Pithikos

Ich lese über Bibliotheken in C, habe aber noch keine Erklärung dafür gefunden, was eine Objektdatei ist. Was ist der wirkliche Unterschied zwischen jeder anderen kompilierten Datei und einer Objektdatei?
Ich würde mich freuen, wenn jemand es in menschlicher Sprache erklären könnte.

  • Eine aktivere Version davon: stackoverflow.com/questions/12122446/…

    – Ciro Santilli OurBigBook.com

    9. November 2015 um 11:02 Uhr

  • Siehe auch Assemblercode vs. Maschinencode vs. Objektcode?

    – Rick

    9. Januar 2020 um 8:10 Uhr

  • Objektdateien sind nicht spezifisch für C

    – JobHunter69

    26. Januar 2021 um 16:14 Uhr

Eine Objektdatei ist die eigentliche Ausgabe der Kompilierungsphase. Es ist hauptsächlich Maschinencode, enthält aber Informationen, die es einem Linker ermöglichen, zu sehen, welche Symbole darin enthalten sind und welche Symbole er benötigt, um zu funktionieren. (Als Referenz sind “Symbole” im Grunde Namen von globalen Objekten, Funktionen usw.)

Ein Linker nimmt all diese Objektdateien und kombiniert sie, um eine ausführbare Datei zu bilden (vorausgesetzt, er kann es, dh es gibt keine doppelten oder undefinierten Symbole). Viele Compiler werden dies für Sie tun (sprich: sie führen den Linker selbst aus), wenn Sie ihnen nicht mit Befehlszeilenoptionen sagen, dass sie “einfach kompilieren” sollen. (-c ist eine gängige Option “nur kompilieren, nicht verknüpfen”.)

  • Tatsächlich ist die Ausgabe der Kompilierungsphase bei den meisten Compilern Assemblercode, und der Compiler ruft dann den Assembler auf, um diesen in eine Objektdatei umzuwandeln.

    – Chris Dodd

    13. Juli 2013 um 5:04 Uhr

  • @ChrisDodd: Das war oft bei älteren Compilern der Fall. Heutzutage generiert ein Compiler nur dann Assemblercode, wenn Sie ihn dazu auffordern, und verwendet ihn häufig nicht intern. Aber wie auch immer, die Montage wäre eine Unterphase der Kompilierungsphase, also ist das alles umstritten.

    – chao

    13. Juli 2013 um 13:43 Uhr


  • kann eine einzelne Objektdatei ausführbar sein?

    – mfaani

    20. Juli 2018 um 12:52 Uhr

  • @Honey: Im Allgemeinen nein. Selbst wenn die Objektdatei in einem für die Ausführung bestimmten Format wäre (was sie im Grunde nie ist), macht dieser Teil über “Symbole, die sie benötigt, um zu funktionieren” im Grunde den Deal zunichte. Sogar Ihr standardmäßiges “Hallo Welt” erfordert das Verknüpfen mit einer C-Laufzeitbibliothek.

    – chao

    20. Juli 2018 um 14:19 Uhr

Benutzeravatar von RHT
RHT

  1. Eine Objektdatei ist die kompilierte Datei selbst. Es gibt keinen Unterschied zwischen den beiden.

  2. Durch Verknüpfung der Objektdateien wird eine ausführbare Datei gebildet.

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

  4. Dieser Low-Level-Maschinencode ist die binäre Darstellung der Anweisungen, die Sie auch direkt in Assemblersprache schreiben und dann den Assemblersprachencode (dargestellt in Englisch) mit einem Assembler in Maschinensprache (dargestellt in Hex) verarbeiten können.

Hier ist ein typischer High-Level-Flow für diesen Prozess für Code in High-Level-Sprache wie C

–> geht durch Präprozessor

–> um optimierten Code zu geben, immer noch in C

–> Compiler durchlaufen

–> Assemblercode angeben

–> geht durch einen Assembler

–> um Code in Maschinensprache zu geben, der in OBJEKTDATEIEN gespeichert ist

–> geht durch Linker

–> um eine ausführbare Datei zu erhalten.

Dieser Fluss kann einige Variationen haben, zum Beispiel können die meisten Compiler den Maschinensprachencode direkt generieren, ohne einen Assembler durchlaufen zu müssen. Ebenso können sie die Vorverarbeitung für Sie übernehmen. Trotzdem ist es schön, die Bestandteile zum besseren Verständnis aufzubrechen.

  • Der optimierte Code wird weder auf der Präprozessorstufe noch unmittelbar danach generiert. Der Präprozessor befasst sich nur mit seiner eigenen Sprache und das war’s. Die Optimierung erfolgt in der Kompilierungs- und Montagephase.

    – Ignas2526

    5. April 2014 um 14:01 Uhr

  • Ist die Objektdatei, die wir nach dem Kompilieren erhalten, dieselbe wie die ausführbare 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. Die .0-Datei, die wir nach der Kompilierung erhalten, ist das also die ausführbare Datei?

    – AV94

    8. September 2016 um 6:08 Uhr

  • kann eine einzelne Objektdatei nicht auch ausführbar sein?

    – mfaani

    20. Juli 2018 um 12:51 Uhr

Benutzeravatar von Paschalis
Paschalis

Es gibt 3 Arten von Objektdateien.

Verschiebbare Objektdateien

Maschinencode in einer Form enthalten, die mit anderen verschiebbaren Objektdateien zur Verbindungszeit kombiniert werden kann, um eine ausführbare Objektdatei zu bilden.

Wenn Sie eine haben a.c Quelldatei, um ihre Objektdatei mit GCC zu erstellen, sollten Sie Folgendes ausführen:
gcc a.c -c

Der vollständige Prozess wäre: Präprozessor (cpp) würde über ac laufen. Seine Ausgabe (immer 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 if -g verwendet wurde) Metadaten und ist nicht direkt ausführbar.

Shared-Object-Dateien

Spezieller Typ einer verschiebbaren Objektdatei, die dynamisch geladen werden kann, entweder zur Ladezeit oder zur Laufzeit. Gemeinsam genutzte Bibliotheken sind ein Beispiel für diese Art von Objekten.

Ausführbare Objektdateien

Maschinencode enthalten, der direkt in den Speicher geladen werden kann (vom Lader, z ausführen) und anschließend ausgeführt.

Das Ergebnis der Ausführung des Linkers über mehrere relocatable object files ist ein executable object file. Der Linker führt alle Eingabeobjektdateien von der Befehlszeile aus von links nach rechts zusammen, indem er alle gleichartigen Eingabeabschnitte (z .data) an den Ausgangsabschnitt des gleichen Typs. Es verwendet symbol resolution und relocation.

Bonus gelesen:

Beim Verlinken gegen a static library Die Funktionen, auf die in den Eingabeobjekten verwiesen wird, werden in die endgültige ausführbare Datei kopiert. Mit dynamic libraries Stattdessen wird eine Symboltabelle erstellt, die eine dynamische Verknüpfung mit den Funktionen/Globals der Bibliothek ermöglicht. Das Ergebnis ist also eine teilweise ausführbare Objektdatei, da dies von der Bibliothek abhängt. Wenn die Bibliothek nicht existiert, 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 -> ld1)

1: ist eigentlich collect2, was ein Wrapper über ld ist.

Eine Objektdatei ist genau das, was Sie erhalten, wenn Sie eine (oder mehrere) Quelldatei(en) kompilieren.

Es kann sich entweder um eine vollständig fertige ausführbare Datei oder Bibliothek oder um Zwischendateien handeln.

Die Objektdateien enthalten typischerweise nativen Code, Linker-Informationen, Debugging-Symbole und so weiter.

Benutzeravatar von Farhan
Farhan

Objektdateien sind Codes, die von Funktionen, Symbolen und Text abhängig sind, um das Programm auszuführen. Genau wie alte Fernschreiber, die Fernschreiben erforderten, um Signale an andere Fernschreiber zu senden.

Genauso wie Prozessoren zum Ausführen Binärcode benötigen, sind Objektdateien wie Binärcode, aber nicht verknüpft. Durch das Linken 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.

1425510cookie-checkWas ist eine Objektdatei in C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy