Was ist das O-Dateiformat?
Eine .o-Datei ist eine kompilierte Objektdatei - ein binäres Zwischenprodukt, das von einem Compiler wie GCC oder Clang erzeugt wird, wenn er eine einzelne C-Quelldatei in Maschinencode übersetzt. Die Ausgabe enthält Maschinenbefehle, initialisierte und uninitialisierte Datensegmente, eine Symboltabelle und Relokationseinträge, ist aber noch nicht ausführbar: Verweise auf Funktionen und Variablen, die in anderen Übersetzungseinheiten definiert sind, bleiben als ungelöste Platzhalter für den Linker stehen.
Das Binärformat hängt von der Zielplattform ab:
- Unter Linux und den meisten Unix/BSD-Systemen verwenden
.o-Dateien den ELF-Container (Executable and Linkable Format), erkennbar an den Magic Bytes\x7FELFbei Byte-Offset 0 und eineme_typevonET_REL(relokatibel, Wert0x0001). - Auf macOS verwendet das Äquivalent das Mach-O-Format, beginnend mit
CF FA ED FE(64-Bit Little-Endian). - Unter Windows wird die funktional identische Datei mit der Erweiterung .obj benannt und verwendet das COFF-Format.
Nach der Kompilierung kombiniert der Linker (ld) eine oder mehrere .o-Dateien mit Bibliotheken, um eine ausführbare Datei oder eine Shared Library zu erstellen. Mehrere .o-Dateien können auch mit dem Befehl ar zu einem statischen Archiv gebündelt werden.
.o-Dateien sind temporäre Build-Artefakte, die automatisch von der Toolchain generiert werden und nicht dazu gedacht sind, von Endbenutzern geöffnet zu werden. Entwickler, die sie untersuchen müssen, können nm, objdump oder readelf verwenden, um Symbole, Sektionen und Disassembly zu prüfen.
Sicherheit
RISIKO: LOWEine .o-Datei besteht aus Build-Daten, nicht aus etwas, das das Betriebssystem startet. Daher stellt sie für Endbenutzer kaum ein direktes Risiko dar - man kann sie nicht per Doppelklick ausführen. Für Entwickler besteht das Risiko im Vertrauen in die Lieferkette: Das Verlinken eines Objekts aus einer nicht vertrauenswürdigen Quelle backt dessen Maschinencode direkt in Ihr Programm ein. Bauen Sie daher nur mit Objekten/Bibliotheken aus Quellen, denen Sie vertrauen. Die Objekte in Ihrem eigenen Build-Verzeichnis können sicher gelöscht werden; sie werden beim nächsten Kompilieren neu generiert.
Formatdetails
kurz gefasstProgramme zum Öffnen von O-Dateien
Technische Details
technische Spezifikation| Container-Format | ELF unter Linux/Unix, Mach-O unter macOS, COFF unter Windows (wo die Datei normalerweise `.obj` genannt wird) |
| Dateikodierung | Binär (kein menschenlesbarer Text) |
| ELF Magic Bytes | `7F 45 4C 46` (`\x7FELF`) bei Byte-Offset 0 - vorhanden in allen ELF-basierten Objektdateien |
| ELF-Objekttyp-Feld | `e_type = ET_REL` (0x0001) im ELF-Header - unterscheidet ein relokatibles Objekt von einer ausführbaren Datei (`ET_EXEC`) oder einer Shared Library (`ET_DYN`) |
| MIME-Typ | `application/x-object`; wird von generischen Servern auch als `application/octet-stream` übertragen |
| Byte-Reihenfolge | Kodiert im `EI_DATA`-Byte des ELF-Headers: Little-Endian (`ELFDATA2LSB`) auf x86/x86-64/ARM, Big-Endian (`ELFDATA2MSB`) auf PowerPC/SPARC |
| Wichtige Sektionen | `.text` (ausführbarer Code), `.data` (initialisierte globale Variablen), `.bss` (mit Null initialisierte globale Variablen), `.rodata` (schreibgeschützte Konstanten) |
| Symboltabelle | Die Sektion `.symtab` listet Name, Bindung (lokal/global/schwach), Typ (Funktion/Objekt) und Wert jedes definierten und referenzierten Symbols auf |
| Relokationseinträge | Die Sektionen `.rel.text` / `.rela.text` protokollieren jede Adressstelle, die der Linker beim Zusammenführen von Objektdateien in eine finale Binärdatei anpassen muss |
| Architektur-Identifizierung | Das Feld `e_machine` im ELF-Header identifiziert das CPU-Ziel: `EM_X86_64` (0x3E), `EM_AARCH64` (0xB7), `EM_386` (0x03), etc. |
| Typische Dateigröße | 1 KB bis mehrere MB pro Übersetzungseinheit, abhängig von der Komplexität des Quellcodes und der Optimierungsstufe des Compilers |
| Kompression | Keine - Objektdateien werden als rohe, unkomprimierte Binärdaten gespeichert |
| Eins-zu-eins-Kompilierungsmodell | Genau eine `.o`-Datei wird pro Quell-Übersetzungseinheit (eine pro `.c`- oder `.cpp`-Datei) ausgegeben; der Linker führt diese später zusammen |
| Paketierung in statische Bibliotheken | Mehrere `.o`-Dateien werden mit `ar` in einer statischen `.a`-Bibliothek archiviert, wobei jedes Objekt als benanntes Mitglied erhalten bleibt |
| Auflösung nur zur Link-Zeit | Im Gegensatz zu `.so` / `.dylib` Shared Libraries werden alle Symbolreferenzen in einer `.o`-Datei vollständig zur Link-Zeit aufgelöst, sodass keine dynamischen Abhängigkeiten zur Laufzeit verbleiben |
| Werkzeuge zur Untersuchung | `nm` (Symbole auflisten), `objdump` (Disassembly und Sektions-Dumps), `readelf` (ELF-Header und Sektionsdetails), `otool` (macOS Mach-O Äquivalent) |
| Veröffentlicht | Object-file concept from early Unix (1970s); ELF since System V Release 4 (early 1990s) |
| Neueste Version | ELF format frozen since the 1990s; container evolves with each compiler/ABI |
| Offener Standard | Ja · lizenzgebührenfrei |
| Spezifikation | refspecs.linuxfoundation.org |
O-Konvertierungen
Community Q&A
von Nutzern gefragtNoch keine Fragen - stellen Sie die erste Frage zu O-Dateien.