Vad är filformatet O?
En .o-fil är en kompilerad objektfil - en mellanliggande binärfil som produceras av en kompilator som GCC eller Clang när den översätter en enskild C-källfil till maskinkod. Utdata innehåller maskininstruktioner, initierade och oinitierade datasegment, en symboltabell och relokeringsposter, men den är ännu inte körbar: referenser till funktioner och variabler som definierats i andra översättningsenheter lämnas som oavlösta platshållare för länkaren.
Det binära formatet beror på målplattformen:
- På Linux och de flesta Unix/BSD-system använder
.o-filer containern ELF (Executable and Linkable Format), som känns igen på de magiska byten\x7FELFvid byte-offset 0 och ene_typeavET_REL(relokerbar, värde0x0001). - På macOS använder motsvarigheten formatet Mach-O, som börjar med
CF FA ED FE(64-bitars little-endian). - På Windows kallas den funktionellt identiska filen med filtillägget .obj och använder formatet COFF.
Efter kompilering kombinerar länkaren (ld) en eller flera .o-filer med bibliotek för att skapa en körbar fil eller ett delat bibliotek. Flera .o-filer kan också buntas ihop till ett statiskt arkiv med kommandot ar.
.o-filer är tillfälliga byggartefakter som genereras automatiskt av verktygskedjan och är inte avsedda att öppnas av slutanvändare. Utvecklare som behöver inspektera dem kan använda nm, objdump eller readelf för att undersöka symboler, sektioner och disassemblering.
Säkerhet & trygghet
RISK: LOWEn .o-fil är data från byggprocessen, inte något som operativsystemet startar, så den utgör liten direkt risk för slutanvändare - du kan inte dubbelklicka och köra den. För utvecklare är oron förtroende för leveranskedjan: att länka ett objekt från en okänd källa bakar in dess maskinkod direkt i ditt program, så bygg endast med objekt/bibliotek från källor du litar på. Objekten i ditt eget bygge är säkra att radera; de återskapas vid nästa kompilering.
Formatdetaljer
i ett nötskalProgram som öppnar O-filer
Tekniska detaljer
djup specifikation| Containerformat | ELF på Linux/Unix, Mach-O på macOS, COFF på Windows (där filen vanligtvis heter `.obj`) |
| Filkodning | Binär (ej läsbar text) |
| ELF magiska byte | `7F 45 4C 46` (`\x7FELF`) vid byte-offset 0 - finns i alla ELF-baserade objektfiler |
| ELF objekttyp-fält | `e_type = ET_REL` (0x0001) i ELF-headern - skiljer ett relokerbart objekt från en körbar fil (`ET_EXEC`) eller ett delat bibliotek (`ET_DYN`) |
| MIME-typ | `application/x-object`; hanteras även som `application/octet-stream` av generiska servrar |
| Byte-ordning | Kodad i `EI_DATA`-byten i ELF-headern: little-endian (`ELFDATA2LSB`) på x86/x86-64/ARM, big-endian (`ELFDATA2MSB`) på PowerPC/SPARC |
| Nyckelsektioner | `.text` (körbar kod), `.data` (initierade globala variabler), `.bss` (noll-initierade globala variabler), `.rodata` (skrivskyddade konstanter) |
| Symboltabell | Sektionen `.symtab` listar varje definierad och refererad symbols namn, bindning (lokal/global/svag), typ (funktion/objekt) och värde |
| Relokeringsposter | Sektionerna `.rel.text` / `.rela.text` registrerar varje adressplats som länkaren måste korrigera när objektfiler slås samman till en slutgiltig binärfil |
| Arkitekturidentifiering | Fältet `e_machine` i ELF-headern identifierar mål-CPU: `EM_X86_64` (0x3E), `EM_AARCH64` (0xB7), `EM_386` (0x03), etc. |
| Typisk filstorlek | 1 KB till flera MB per översättningsenhet, beroende på källkodens komplexitet och kompilatorns optimeringsnivå |
| Komprimering | Ingen - objektfiler lagras som rå okomprimerad binärdata |
| En-till-en kompileringsmodell | Exakt en `.o`-fil skapas per källöversättningsenhet (en per `.c`- eller `.cpp`-fil); länkaren slår senare samman dem |
| Paketering i statiska bibliotek | Flera `.o`-filer arkiveras i ett statiskt bibliotek av typen `.a` med hjälp av `ar`, vilket bevarar varje objekt som en namngiven medlem |
| Endast upplösning vid länkning | Till skillnad från delade bibliotek som `.so` / `.dylib`, löses alla symbolreferenser i en `.o` helt vid länkningstillfället, vilket inte lämnar några dynamiska beroenden vid körning |
| Inspektionsverktyg | `nm` (lista symboler), `objdump` (disassemblering och sektionsdumpar), `readelf` (ELF-header och sektionsdetaljer), `otool` (motsvarighet för macOS Mach-O) |
| Släppt | Object-file concept from early Unix (1970s); ELF since System V Release 4 (early 1990s) |
| Senaste version | ELF format frozen since the 1990s; container evolves with each compiler/ABI |
| Öppen standard | Ja · royaltyfri |
| Specifikation | refspecs.linuxfoundation.org |
O-konverteringar
Frågor & svar
frågat av användareInga frågor än - bli den första att fråga om O-filer.