Che cos'è il formato di file O?
Un file .o è un file oggetto compilato - un binario intermedio prodotto da un compilatore come GCC o Clang quando traduce un singolo file sorgente C in codice macchina. L'output contiene istruzioni macchina, segmenti di dati inizializzati e non inizializzati, una tabella dei simboli e voci di rilocazione, ma non è ancora eseguibile: i riferimenti a funzioni e variabili definite in altre unità di traduzione sono lasciati come segnaposto non risolti per il linker.
Il formato binario dipende dalla piattaforma di destinazione:
- Su Linux e sulla maggior parte dei sistemi Unix/BSD, i file
.outilizzano il contenitore ELF (Executable and Linkable Format), riconosciuto dai magic bytes\x7FELFall'offset 0 e une_typediET_REL(rilocabile, valore0x0001). - Su macOS, l'equivalente utilizza il formato Mach-O, che inizia con
CF FA ED FE(64-bit little-endian). - Su Windows, il file funzionalmente identico è denominato con l'estensione .obj e utilizza il formato COFF.
Dopo la compilazione, il linker (ld) combina uno o più file .o con le librerie per produrre un eseguibile o una libreria condivisa. Più file .o possono anche essere raggruppati in un archivio statico utilizzando il comando ar.
I file .o sono artefatti di build temporanei generati automaticamente dalla toolchain e non sono destinati ad essere aperti dagli utenti finali. Gli sviluppatori che hanno necessità di ispezionarli possono usare nm, objdump o readelf per esaminare simboli, sezioni e disassemblaggio.
Sicurezza e incolumità
RISCHIO: LOWUn .o è un dato del tempo di build, non qualcosa che il sistema operativo lancia, quindi presenta scarsi rischi diretti per gli utenti finali - non è possibile fare doppio clic ed eseguirlo. Per gli sviluppatori, la preoccupazione riguarda la fiducia nella catena di approvvigionamento: collegare un oggetto da una fonte non attendibile inserisce il suo codice macchina direttamente nel programma, quindi compila solo con oggetti/librerie provenienti da fonti fidate. Gli oggetti nel tuo albero di build sono sicuri da eliminare; si rigenerano alla compilazione successiva.
Dettagli del formato
in sintesiProgrammi che aprono file O
Dettagli tecnici
specifiche approfondite| Formato contenitore | ELF su Linux/Unix, Mach-O su macOS, COFF su Windows (dove il file è tipicamente denominato `.obj`) |
| Codifica file | Binario (testo non leggibile dall'uomo) |
| Magic bytes ELF | `7F 45 4C 46` (`\x7FELF`) all'offset 0 - presente in tutti i file oggetto basati su ELF |
| Campo tipo oggetto ELF | `e_type = ET_REL` (0x0001) nell'intestazione ELF - distingue un oggetto rilocabile da un eseguibile (`ET_EXEC`) o da una libreria condivisa (`ET_DYN`) |
| Tipo MIME | `application/x-object`; trasportato anche come `application/octet-stream` dai server generici |
| Ordine dei byte | Codificato nel byte `EI_DATA` dell'intestazione ELF: little-endian (`ELFDATA2LSB`) su x86/x86-64/ARM, big-endian (`ELFDATA2MSB`) su PowerPC/SPARC |
| Sezioni chiave | `.text` (codice eseguibile), `.data` (globali inizializzati), `.bss` (globali inizializzati a zero), `.rodata` (costanti in sola lettura) |
| Tabella dei simboli | La sezione `.symtab` elenca il nome di ogni simbolo definito e referenziato, il binding (local/global/weak), il tipo (function/object) e il valore |
| Voci di rilocazione | Le sezioni `.rel.text` / `.rela.text` registrano ogni slot di indirizzo che il linker deve correggere quando unisce i file oggetto in un binario finale |
| Identificazione architettura | Il campo `e_machine` nell'intestazione ELF identifica la CPU di destinazione: `EM_X86_64` (0x3E), `EM_AARCH64` (0xB7), `EM_386` (0x03), ecc. |
| Dimensione tipica del file | Da 1 KB a diversi MB per unità di traduzione, a seconda della complessità del sorgente e del livello di ottimizzazione del compilatore |
| Compressione | Nessuna - i file oggetto sono memorizzati come dati binari grezzi non compressi |
| Modello di compilazione uno-a-uno | Viene emesso esattamente un file `.o` per ogni unità di traduzione sorgente (uno per ogni file `.c` o `.cpp`); il linker li unirà successivamente |
| Packaging in libreria statica | Più file `.o` vengono archiviati in una libreria statica `.a` usando `ar`, che preserva ogni oggetto come membro denominato |
| Risoluzione solo al link-time | A differenza delle librerie condivise `.so` / `.dylib`, tutti i riferimenti ai simboli in un `.o` vengono risolti interamente al momento del collegamento, senza lasciare dipendenze dinamiche al runtime |
| Strumenti di ispezione | `nm` (elenco simboli), `objdump` (disassemblaggio e dump delle sezioni), `readelf` (intestazione ELF e dettagli sezioni), `otool` (equivalente Mach-O per macOS) |
| Rilasciato | Object-file concept from early Unix (1970s); ELF since System V Release 4 (early 1990s) |
| Ultima versione | ELF format frozen since the 1990s; container evolves with each compiler/ABI |
| Standard aperto | Sì · royalty-free |
| Specifica | refspecs.linuxfoundation.org |
Conversioni O
Domande e risposte della community
chiesto dagli utentiAncora nessuna domanda - sii il primo a chiedere informazioni sui file O.