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.c
file 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 -g
metadati 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 resolution
e relocation
.
Bonus letto:
Quando si esegue il collegamento con a, static library
le funzioni a cui fanno riferimento gli oggetti di input vengono copiate nell'eseguibile finale. Con dynamic libraries
una 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 myexecutable
invocherà tutti i comandi menzionati al punto 1 e al punto 3 (cpp -> cc1 -> as -> ld 1 )
1: attualmente è collect2, che è un wrapper su ld.