Esistono 3 tipi di file oggetto.
File di oggetti trasferibili
Contenere il codice macchina in una forma che può essere combinata con altri file oggetto trasferibili al momento del collegamento, al fine di formare un file oggetto eseguibile.
Se hai un a.cfile sorgente, per creare il suo file oggetto con GCC devi eseguire:
gcc a.c -c
Il processo completo sarebbe: il preprocessore (cpp) verrebbe eseguito su ac Il suo output (fonte fissa) verrà immesso nel compilatore (cc1). Il suo output (assembly) verrà inserito nell'assemblatore (as), che produrrà il file relocatable object file. Tale file contiene -gmetadati di codice oggetto e collegamento (e debug se utilizzato) e non è eseguibile direttamente.
File di oggetti condivisi
Tipo speciale di file oggetto trasferibile che può essere caricato in modo dinamico, al momento del caricamento o in fase di esecuzione. Le librerie condivise sono un esempio di questo tipo di oggetti.
File di oggetti eseguibili
Contiene il codice macchina che può essere caricato direttamente in memoria (dal caricatore, ad es. Execve ) e successivamente eseguito.
Il risultato dell'esecuzione del linker su più relocatable object filesè un executable object file. Il linker unisce tutti i file oggetto di input dalla riga di comando, da sinistra a destra, unendo tutte le sezioni di input dello stesso tipo (ad es. .data) Alla sezione di output dello stesso tipo. Usa symbol resolutione relocation.
Bonus letto:
Quando si esegue il collegamento con a, static libraryle funzioni a cui fanno riferimento gli oggetti di input vengono copiate nell'eseguibile finale. Con dynamic librariesuna tabella di simboli viene invece creato che consentirà un collegamento dinamico con le funzioni / i globali della libreria. Pertanto, il risultato è un file oggetto parzialmente eseguibile, poiché dipende dalla libreria. Se la libreria non esiste, il file non può più essere eseguito).
Il processo di collegamento può essere eseguito come segue:
ld a.o -o myexecutable
Il comando: gcc a.c -o myexecutableinvocherà tutti i comandi menzionati al punto 1 e al punto 3 (cpp -> cc1 -> as -> ld 1 )
1: attualmente è collect2, che è un wrapper su ld.