Hvad er O-filformatet?
En .o-fil er en kompileret objektfil - et mellemliggende binært format produceret af en compiler som GCC eller Clang, når den oversætter en enkelt C-kildekodefil til maskinkode. Outputtet indeholder maskininstruktioner, initialiserede og uinitialiserede datasegmenter, en symboltabel og relokeringsindgange, men den er endnu ikke eksekverbar: referencer til funktioner og variabler defineret i andre oversættelsesenheder efterlades som uafklarede pladsholdere til linkeren.
Det binære format afhænger af målplatformen:
- På Linux og de fleste Unix/BSD-systemer bruger
.o-filer ELF (Executable and Linkable Format) containeren, genkendt på magic bytes\x7FELFved byte-offset 0 og ene_typepåET_REL(relocatable, værdi0x0001). - På macOS bruger den tilsvarende fil Mach-O-formatet, der begynder med
CF FA ED FE(64-bit little-endian). - På Windows kaldes den funktionelt identiske fil med filtypen .obj og bruger COFF-formatet.
Efter kompilering kombinerer linkeren (ld) en eller flere .o-filer med biblioteker for at producere en eksekverbar fil eller et delt bibliotek. Flere .o-filer kan også bundtes i et statisk arkiv ved hjælp af kommandoen ar.
.o-filer er midlertidige build-artefakter genereret automatisk af toolchainen og er ikke beregnet til at blive åbnet af slutbrugere. Udviklere, der har brug for at inspicere dem, kan bruge nm, objdump eller readelf til at undersøge symboler, sektioner og disassembly.
Sikkerhed og tryghed
RISIKO: LOWEn .o er build-tidsdata, ikke noget operativsystemet starter, så den udgør lille direkte risiko for slutbrugere - du kan ikke dobbeltklikke og køre den. For udviklere er bekymringen tillid til forsyningskæden: linkning af et objekt fra en upålidelig kilde bager dets maskinkode direkte ind i dit program, så byg kun med objekter/biblioteker fra kilder, du stoler på. Objekterne i dit eget build-træ er sikre at slette; de regenereres ved næste kompilering.
Formatdetaljer
kort fortaltProgrammer der åbner O-filer
Tekniske detaljer
dyb specifikation| Containerformat | ELF på Linux/Unix, Mach-O på macOS, COFF på Windows (hvor filen typisk hedder `.obj`) |
| Filkodning | Binær (ikke menneskeligt læsbar tekst) |
| ELF magic bytes | `7F 45 4C 46` (`\x7FELF`) ved byte-offset 0 - findes i alle ELF-baserede objektfiler |
| ELF objekttype-felt | `e_type = ET_REL` (0x0001) i ELF-headeren - skelner et relokerbart objekt fra en eksekverbar fil (`ET_EXEC`) eller et delt bibliotek (`ET_DYN`) |
| MIME-type | `application/x-object`; også overført som `application/octet-stream` af generiske servere |
| Byte-orden | Kodet i `EI_DATA`-byten i ELF-headeren: little-endian (`ELFDATA2LSB`) på x86/x86-64/ARM, big-endian (`ELFDATA2MSB`) på PowerPC/SPARC |
| Nøglesektioner | `.text` (eksekverbar kode), `.data` (initialiserede globale variabler), `.bss` (nul-initialiserede globale variabler), `.rodata` (skrivebeskyttede konstanter) |
| Symboltabel | `.symtab`-sektionen viser hvert defineret og refereret symbols navn, binding (lokal/global/svag), type (funktion/objekt) og værdi |
| Relokeringsindgange | `.rel.text` / `.rela.text`-sektioner registrerer hver adresseplads, som linkeren skal patche, når objektfiler flettes til en endelig binær fil |
| Arkitekturidentifikation | `e_machine`-feltet i ELF-headeren identificerer CPU-målet: `EM_X86_64` (0x3E), `EM_AARCH64` (0xB7), `EM_386` (0x03), osv. |
| Typisk filstørrelse | 1 KB til flere MB pr. oversættelsesenhed, afhængigt af kildekodens kompleksitet og compilerens optimeringsniveau |
| Komprimering | Ingen - objektfiler gemmes som rå ukomprimerede binære data |
| En-til-en kompileringsmodel | Præcis én `.o`-fil udsendes pr. kildeoversættelsesenhed (én pr. `.c` eller `.cpp` fil); linkeren fletter dem senere |
| Statisk bibliotekspakning | Flere `.o`-filer arkiveres i et `.a` statisk bibliotek ved hjælp af `ar`, som bevarer hvert objekt som et navngivet medlem |
| Kun opløsning ved link-tid | I modsætning til `.so` / `.dylib` delte biblioteker, opløses alle symbolreferencer i en `.o` fuldstændigt ved link-tid, hvilket ikke efterlader nogen dynamiske afhængigheder ved kørsel |
| Inspektionsværktøjer | `nm` (liste over symboler), `objdump` (disassembly og sektions-dumps), `readelf` (ELF-header og sektionsdetaljer), `otool` (macOS Mach-O tilsvarende) |
| Udgivet | Object-file concept from early Unix (1970s); ELF since System V Release 4 (early 1990s) |
| Seneste version | ELF format frozen since the 1990s; container evolves with each compiler/ABI |
| Åben standard | Ja · royaltyfri |
| Specifikation | refspecs.linuxfoundation.org |
O-konverteringer
Fællesskabets Q&A
spurgt af brugereIngen spørgsmål endnu - vær den første til at spørge om O-filer.