Hva er O-filformatet?
En .o-fil er en kompilert objektfil - et mellomliggende binærformat produsert av en kompilator som GCC eller Clang når den oversetter en enkelt C-kildefil til maskinkode. Utdataen inneholder maskininstruksjoner, initialiserte og uinitialiserte datasegmenter, en symboltabell og relokeringsposter, men den er ennå ikke kjørbar: referanser til funksjoner og variabler definert i andre oversettelsesenheter er etterlatt som uoppklarte plassholdere for lenkeren.
Det binære formatet avhenger av målplattformen:
- På Linux og de fleste Unix/BSD-systemer bruker
.o-filer ELF-beholderen (Executable and Linkable Format), gjenkjent av de magiske bytene\x7FELFved byte-offset 0 og ene_typepåET_REL(relokerbar, verdi0x0001). - På macOS bruker tilsvarende fil Mach-O-formatet, som begynner med
CF FA ED FE(64-bit little-endian). - På Windows kalles den funksjonelt identiske filen med filendelsen .obj og bruker COFF-formatet.
Etter kompilering kombinerer lenkeren (ld) én eller flere .o-filer med biblioteker for å produsere en kjørbar fil eller et delt bibliotek. Flere .o-filer kan også buntes sammen til et statisk arkiv ved hjelp av kommandoen ar.
.o-filer er midlertidige bygg-artefakter generert automatisk av verktøykjeden og er ikke ment å åpnes av sluttbrukere. Utviklere som trenger å inspisere dem kan bruke nm, objdump eller readelf for å undersøke symboler, seksjoner og disassemblering.
Sikkerhet og trygghet
RISIKO: LOWEn .o-fil er data fra byggetid, ikke noe operativsystemet starter, så den utgjør liten direkte risiko for sluttbrukere - du kan ikke dobbeltklikke og kjøre den. For utviklere er bekymringen tillit til forsyningskjeden: å lenke et objekt fra en utroverdig kilde baker maskinkoden dens rett inn i programmet ditt, så bygg bare med objekter/biblioteker fra kilder du stoler på. Objektene i ditt eget bygg-tre er trygge å slette; de regenereres ved neste kompilering.
Formatdetaljer
i et nøtteskallProgrammer som åpner O-filer
Tekniske detaljer
dyp spesifikasjon| Beholderformat | ELF på Linux/Unix, Mach-O på macOS, COFF på Windows (hvor filen vanligvis heter `.obj`) |
| Filkoding | Binær (ikke menneskelig lesbar tekst) |
| ELF magiske byte | `7F 45 4C 46` (`\x7FELF`) ved byte-offset 0 - til stede i alle ELF-baserte objektfiler |
| ELF objekttype-felt | `e_type = ET_REL` (0x0001) i ELF-headeren - skiller et relokerbart objekt fra en kjørbar fil (`ET_EXEC`) eller et delt bibliotek (`ET_DYN`) |
| MIME-type | `application/x-object`; også overført som `application/octet-stream` av generiske servere |
| Byterekkefølge | Kodet i `EI_DATA`-byten i ELF-headeren: little-endian (`ELFDATA2LSB`) på x86/x86-64/ARM, big-endian (`ELFDATA2MSB`) på PowerPC/SPARC |
| Nokkelseksjoner | `.text` (kjørbar kode), `.data` (initialiserte globaler), `.bss` (null-initialiserte globaler), `.rodata` (skrivebeskyttede konstanter) |
| Symboltabell | `.symtab`-seksjonen lister hvert definerte og refererte symbols navn, binding (lokal/global/svak), type (funksjon/objekt) og verdi |
| Relokeringsposter | `.rel.text` / `.rela.text`-seksjoner registrerer hver adresseplass lenkeren må patche når objektfiler slås sammen til en endelig binærfil |
| Arkitekturidentifikasjon | `e_machine`-feltet i ELF-headeren identifiserer CPU-målet: `EM_X86_64` (0x3E), `EM_AARCH64` (0xB7), `EM_386` (0x03), osv. |
| Typisk filstørrelse | 1 KB til flere MB per oversettelsesenhet, avhengig av kildens kompleksitet og kompilatorens optimaliseringsnivå |
| Komprimering | Ingen - objektfiler lagres som rå ukomprimerte binærdata |
| En-til-en kompileringsmodell | Nøyaktig én `.o`-fil sendes ut per kildeoversettelsesenhet (én per `.c`- eller `.cpp`-fil); lenkeren slår dem sammen senere |
| Statisk bibliotek-pakking | Flere `.o`-filer arkiveres i et `.a` statisk bibliotek ved hjelp av `ar`, som bevarer hvert objekt som et navngitt medlem |
| Kun oppløsning ved lenketid | I motsetning til `.so` / `.dylib` delte biblioteker, blir alle symbolreferanser i en `.o` løst fullstendig ved lenketid, uten kjøretidsavhengigheter |
| Inspeksjonsverktøy | `nm` (liste symboler), `objdump` (disassemblering og seksjonsdump), `readelf` (ELF-header og seksjonsdetaljer), `otool` (macOS Mach-O-ekvivalent) |
| Utgitt | Object-file concept from early Unix (1970s); ELF since System V Release 4 (early 1990s) |
| Siste versjon | ELF format frozen since the 1990s; container evolves with each compiler/ABI |
| Åpen standard | Ja · royalty-fri |
| Spesifikasjon | refspecs.linuxfoundation.org |
O-konverteringer
Spørsmål og svar fra fellesskapet
spurt av brukereIngen spørsmål ennå - vær den første til å spørre om O-filer.