Was enthält eine Objektdatei?

Lesezeit: 4 Minuten

Vijays Benutzeravatar
Vijay

Ich weiß, dass während der verschiedenen Phasen der Kompilierung in C oder C++ eine Objektdatei generiert wird (dh die Datei „any_name.o“). Was enthält diese .o-Datei? Ich kann es nicht öffnen, da es eine Binärdatei ist.

Könnte mir bitte jemand helfen? Ist der Inhalt der Objektdatei hauptsächlich von dem Compiler abhängig, den wir unter Unix verwenden?

  • Es gibt eine ganze Reihe von *nix-Tools, um in eine Objektdatei zu schauen: Beginnen Sie mit nm, unixhelp.ed.ac.uk/CGI/man-cgi?nm

    – Martin York

    15. Juni 2010 um 13:48 Uhr

Objektdateien können eine Menge Dinge enthalten: Im Grunde sind es einige oder alle der folgenden Liste:

  • Symbolnamen
  • Kompilierter Code
  • Konstante Daten, z. Saiten
  • Importe – welche Symbole der kompilierte Code referenziert (wird vom Linker korrigiert)
  • Exporte – welche Symbole die Objektdatei ANDEREN Objektdateien zur Verfügung stellt.

Der Linker verwandelt eine Reihe von Objektdateien in eine ausführbare Datei, indem er alle Importe und Exporte abgleicht und den kompilierten Code so ändert, dass die richtigen Funktionen aufgerufen werden.

Benutzeravatar von kriss
kriss

Es gibt mehrere standardisierte Formate (COFF, ELF unter Unix), im Grunde sind es Varianten der gleichen Formate, die für ausführbare Dateien verwendet werden, denen jedoch einige Informationen fehlen. Diese fehlenden Informationen werden beim Verlinken ergänzt.

Objects-Dateiformate enthalten grundsätzlich die gleichen Informationen:

  • Binärcode, der aus der Kompilierung resultiert (für einen Zielprozessor)
  • Statische Daten, die von diesem Teil des Programms verwendet werden (wie konstante Zeichenfolgen usw.). Sie können eine feinere Unterscheidung zwischen BSS (exportierte Daten) und Text (Daten, die vom Programm nicht geändert werden) treffen. Aber das ist vor allem für Compiler und Linker wichtig. Beachten Sie, dass Daten wie Binärcode auch vom Ziel abhängig sind (Big-Endian, Little-Endian, 32 Bit, 64 Bit).
  • Tabellen von Symbolen, die von diesem Teil des Programms exportiert werden (meistens Funktionseinstiegspunkte)
  • Tabellen externer Symbole, die von diesem Teil des Programms verwendet werden

Wenn Objekte miteinander verknüpft werden, werden die Teile des Codes, die sich auf externe Symbole beziehen, durch tatsächliche Werte ersetzt (naja, das ist immer noch zu stark vereinfacht, es gibt einen letzten Teil, der beim Laden des Programms ausgeführt wird, aber das ist der Idee).

Die Objektdatei kann auch mehr Symbolinformationen enthalten, die unbedingt zum Auflösen von Importen und Exporten erforderlich sind (nützlich für die Fehlersuche). Diese Informationen können mit dem Strip-Befehl entfernt werden.

Benutzeravatar von Daniel Băluţă
Daniel Băluţă

Lesen Sie zuerst die Wiki-Seite. Sie können verwenden objdump um eine solche Datei zu untersuchen 🙂

Benutzeravatar von Matthew Flaschen
Matthäus Flaschen

Verwenden Sie für solche Dinge den Befehl file. Es ist ein ELF object-Datei auf einem modernen Linux-System. ZB wenn für 32-Bit x86 kompiliert.

ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

Im Gegensatz dazu könnte eine dynamisch verknüpfte ausführbare Datei wie folgt aussehen:

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

Um Kopfzeilen einschließlich Abschnittsnamen anzuzeigen, können Sie Folgendes verwenden:

objdump -x any_name.o

Zum zerlegen:

objdump -d any_name.o

Erstens binäre Dateien kann geöffnet werden! Haben Sie keine Angst davor, Sie brauchen nur die richtigen Werkzeuge! Da es sich um binäre Daten handelt, ist ein Texteditor natürlich nicht das richtige Werkzeug; ein richtiges Werkzeug könnte ein Hex-Editor oder ein fortgeschrittener Editor wie Emacs sein, oder ein Werkzeug, das, anstatt einfach Bytes in ihrer “Hex”-Darstellung “auszugeben” und Sie mit Ihrer Interpretation der Daten allein zu lassen, dieses bestimmte Format kennt und ” interpretiert” die Daten auf einer bestimmten Ebene richtig (z. B. interpretiert GIMP eine PNG-Datei als Bild und zeigt es an, ein PNG-Analyzer “zerlegt” die Daten in PNG-Abschnitten und zeigt Ihnen die Flags in bestimmten Bytes usw.).

In Ihrem Fall lautet die allgemeine Antwort, dass die Objektdatei Ihren kompilierten Code (und Ihre Daten) sowie alle zusätzlichen Informationen enthält, die vom Linker benötigt werden, und eventuell mehr.

Wie diese Informationen „organisiert“ sind und in manchen Fällen woraus das „eventuell mehr“ besteht, hängt vom jeweiligen Objektformat ab. Einige Wikipedia-Links, die einige der Möglichkeiten auflisten, sind Dies, Dies, Dies, Dies

Jeder von ihnen kann seine Tools haben, um den Inhalt zu analysieren; z.B readelf für ELF, objdump für mehrere Formate (versuchen Sie es objdump -i) je nachdem, wie es kompiliert wurde.

Benutzeravatar von ChrisF
ChrisF

Die Objektdatei ist die kompilierte Quelle.

Dies bedeutet, dass es sich um Maschinencode handelt, der von der Zielplattform (Sie können für Unix unter Windows kompilieren, wenn Sie wirklich wollen) und dem verwendeten Compiler abhängig ist. Unterschiedliche Compiler erzeugen aus derselben Quelldatei unterschiedlichen Maschinencode.

Benutzeravatar von soulmerge
Seelenverschmelzung

Die Datei enthält binäre Daten, die durchlaufen werden müssen Linker um eine ausführbare Datei zu generieren. Es handelt sich im Wesentlichen um eine Reihe von Maschinencodeanweisungen mit benannten Abschnitten (die Ihren Funktionen entsprechen). Aus Wikipedias ‘Objektdatei‘ Artikel:

In der Informatik ist eine Objektdatei eine organisierte Sammlung separater, benannter Sequenzen von Maschinencode[citation needed]. Jede Sequenz oder jedes Objekt enthält typischerweise Anweisungen für die Host-Maschine, um eine Aufgabe auszuführen, möglicherweise begleitet von verwandten Daten und Metadaten (z. B. Verschiebungsinformationen, Informationen zum Entladen des Stapels, Kommentare, Programmsymbole, Debugging- oder Profiling-Informationen). Ein Linker wird normalerweise verwendet, um eine ausführbare Datei oder Bibliothek zu generieren, indem Teile von Objektdateien kombiniert werden.

1411930cookie-checkWas enthält eine Objektdatei?

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

Privacy policy