Che cos'è un file oggetto in C?


140

Sto leggendo delle biblioteche in C ma non ho ancora trovato una spiegazione su cosa sia un file oggetto. Qual è la vera differenza tra qualsiasi altro file compilato e un file oggetto?
Sarei felice se qualcuno potesse spiegare in linguaggio umano.



Risposte:


153

Un file oggetto è l'output reale della fase di compilazione. È principalmente un codice macchina, ma ha informazioni che consentono a un linker di vedere quali simboli sono presenti al suo interno, nonché i simboli richiesti per funzionare. (Per riferimento, i "simboli" sono fondamentalmente nomi di oggetti globali, funzioni, ecc.)

Un linker prende tutti questi file oggetto e li combina per formare un eseguibile (supponendo che possa, cioè: che non ci siano simboli duplicati o indefiniti). Molti compilatori lo faranno per te (leggi: eseguono il linker da soli) se non dici loro di "compilare" usando le opzioni della riga di comando. ( -cè un'opzione comune "solo compilare; non collegare").


In realtà, con la maggior parte dei compilatori, l'output della fase di compilazione è il codice assembly e il compilatore invoca quindi l'assemblatore per trasformarlo in un file oggetto.
Chris Dodd,

15
@ChrisDodd: Questo è stato spesso il caso dei compilatori più vecchi. Al giorno d'oggi, un compilatore non genererà il codice assembly a meno che tu non lo richieda e spesso non lo utilizza internamente. Ma in entrambi i casi, l'assemblaggio sarebbe una sottofase della fase di compilazione, quindi tutto ciò è discutibile.
cao

2
è possibile eseguire un singolo file oggetto?
Miele

1
@Honey: generalmente no. Anche se il file oggetto era in un formato progettato per l'esecuzione (cosa che in pratica non lo è mai), quella parte sui "simboli che richiede per funzionare" uccide sostanzialmente l'affare. Anche il tuo "ciao mondo" standard richiede il collegamento a una libreria di runtime C.
cHao,

74
  1. Un file oggetto è il file compilato stesso. Non c'è differenza tra i due.

  2. Un file eseguibile viene formato collegando i file Object.

  3. Il file oggetto contiene istruzioni di basso livello che possono essere comprese dalla CPU. Ecco perché è anche chiamato codice macchina.

  4. Questo codice macchina di basso livello è la rappresentazione binaria delle istruzioni che è anche possibile scrivere direttamente usando il linguaggio assembly e quindi elaborare il codice linguaggio assembly (rappresentato in inglese) in linguaggio macchina (rappresentato in esadecimale) utilizzando un assemblatore.

Ecco un tipico flusso di alto livello per questo processo per il codice in un linguaggio di alto livello come C

-> passa attraverso il pre-processore

-> per fornire un codice ottimizzato, sempre in C

-> passa attraverso il compilatore

-> per fornire il codice assembly

-> passa attraverso un assemblatore

-> per fornire il codice nel linguaggio macchina che è memorizzato in FILE OGGETTO

-> passa attraverso Linker

-> per ottenere un file eseguibile.

Questo flusso può presentare alcune variazioni, ad esempio la maggior parte dei compilatori può generare direttamente il codice del linguaggio macchina, senza passare attraverso un assemblatore. Allo stesso modo, possono fare la pre-elaborazione per te. Tuttavia, è bello rompere i componenti per una migliore comprensione.


5
Il codice ottimizzato non viene generato nella fase pre-processore né immediatamente dopo. Il pre-processore si occupa solo della sua lingua e basta. L'ottimizzazione avviene in fase di compilazione e assemblaggio.
Ignas2526,

Il file oggetto che otteniamo dopo la compilazione è uguale al file eseguibile in linguaggio macchina. Sono confuso perché, hai detto che il file oggetto viene creato al secondo passaggio dall'ultimo e l'ultimo passaggio è il file eseguibile. Quindi, il file .0 che otteniamo dopo la compilazione, è quello il file eseguibile?
AV94,

non è possibile eseguire anche un singolo file oggetto?
Miele,

33

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.


11

Un file oggetto è esattamente quello che ottieni quando compili uno (o più) file di origine.

Può essere un file eseguibile o una libreria completamente completata o file intermedi.

I file oggetto in genere contengono codice nativo, informazioni sul linker, simboli di debug e così via.


2

I file oggetto sono codici che dipendono da funzioni, simboli e testo per eseguire il programma. Proprio come le vecchie macchine telex, che richiedevano il teletipo per inviare segnali ad altre macchine telex.

Allo stesso modo in cui il processore richiede l'esecuzione del codice binario, i file oggetto sono come il codice binario ma non sono collegati. Il collegamento crea file aggiuntivi in ​​modo che l'utente non debba compilare il linguaggio C. Gli utenti possono aprire direttamente il file exe una volta che il file oggetto è collegato con alcuni compilatori come linguaggio c, o vb ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.