# COFF

L'acronimo COFF (dall'inglese Common Object File Format) indica le specifiche di alcuni tipi di file usati nei sistemi operativi Unix: file eseguibili, file di codice oggetto e file di libreria condivisa. Il COFF fu introdotto nello UNIX System IV e fu alla base dei formati estesi XCOFF e ECOFF, prima di essere rimpiazzato dal formato ELF, introdotto con lo UNIX System V. Tuttavia il COFF e le sue varianti continuano ad essere usati in alcuni sistemi Unix-like e in Microsoft Windows.

## Storia

Il formato originale Unix per i file di codice oggetto, chiamato a.out, aveva una struttura molto semplice, inadeguata per tecnologie quali il debugging simbolico e le librerie condivise. Poiché lo sviluppo di sistemi Unix-like avveniva in diverse sedi (dentro e fuori la AT&T) furono implementate diverse soluzioni per sopperire alle limitazioni di a.out.
COFF fu introdotto nello UNIX System V, prodotto dalla AT&T, per piattaforme a 32 bit non VAX quali il 3B20. I miglioramenti all'esistente formato a.out di AT&T comprendevano supporto nativo per:
* informazioni necessarie al debugging simbolico
* librerie condivise
* meccanismo di estensioni
Tuttavia, sebbene COFF fu un miglioramento rispetto ad a.out, l'architettura era ancora troppo limitata: c'era un limite nel numero massimo di sezioni, un limite nella lunghezza dei nomi delle sezioni e il supporto all'inserzione di informazioni per il debugging simbolico non era compatibile con nuovi linguaggi come il C++. Per superare queste limitazioni AT&T con il rilascio di System V Release 4 rilasciò anche il formato ELF; IBM usò il formato XCOFF nello AIX, DEC, SGI e altri usarono il formato ECOFF; altri sistemi migliorarono il loro formati di eseguibili proprietari e non portabili ad altre piattaforme.
Mentre versioni estese di COFF continuano ad essere usate in molte piattaforme Unix-like, principalmente sistemi embedded, forse l'uso più massiccio del formato COFF oggi è quello effettuato in Windows, con il suo formato PE. Sviluppato per Windows NT, il formato PE (a volte citato come PE/COFF) usa uno schema di intestazione COFF per i file oggetto e nei file eseguibili lo schema di intestazione COFF è inserito nel più vasto schema di intestazione PE.

## Caratteristiche

Il principale miglioramento di COFF rispetto ad a.out fu l'introduzione di più sezioni nominabili nel file oggetto. Diversi file oggetto possono avere diverse quantità e tipi di sezioni.

### Informazioni per il debugging simbolico

Le informazioni per il debugging simbolico dei file COFF consistono in nomi simbolici (stringhe) associati a funzioni e variabili del programma, e informazioni sui numeri di linea, usati per impostare [breakpoint] e per il tracciamento durante l'esecuzione. Il formato a.out non forniva supporto nativo per il debugging simbolico, anche se questo limite poteva essere parzialmente superato usano meccanismi come lo stabs (Symbol TAble entrieS).
I nomi simbolici sono conservati nella tabella dei simboli. Ogni voce della tabella dei simboli comprende nome, classe di memorizzazione, tipo, valore e numero di sezione. Nomi corti (di otto caratteri o meno) sono salvati direttamente nella tabella dei simboli; i nomi lunghi sono salvati in forma di indirizzo che punta alla tabella delle stringhe presente alla fine dell'oggetto COFF.
La classe di memorizzazione descrive il tipo di entità che il simbolo rappresenta, che può essere C_EXT (variabile esterna), C_AUTO (variabile automatica dello stack), C_REG (variabile di registro), C_FCN (funzione)) e molte altre. Il tipo prescrive come sia da interpretare il valore associato al simbolo, ed è possibile riconoscere ognuno dei tipi del C.
Quando compilato con le opzioni appropriate, un file oggetto COFF contiene informazioni sul numero di linea per ogni possibile breakpoint presente nella sezione text del file oggetto. Le informazioni sui numeri di linea sono in due forme: nella prima, per ogni possibile breakpoint la voce nella tabella dei numeri di linea contiene l'indirizzo del breakpoint e il corrispondente numero di linea. Nella seconda forma, la voce indica a sua volta una voce della tabella dei simboli che rappresenta l'inizio di una funzione, rendendo così possibile l'impostazione di un breakpoint usando il nome della funzione stessa.
Si noti che il formato COFF non era capace di rappresentare numeri di riga o simboli di debug per sorgente incluso con i file di header rendendo virtualmente inutili le informazioni di debug del file COFF senza l'uso di estensioni incompatibili.

### Indirizzi virtuali relativi (RVA)

Quando viene generato un file COFF, di solito non si sa in quale parte della memoria esso verrà caricato. L'indirizzo virtuale dove il primo byte del file sarà caricato è chiamato indirizzo di base del file immagine. Il resto del file non sarà necessariamente presente in un blocco di memoria contiguo, ma in sezioni di memoria differenti.
L'indirizzo RVA (Relative Virtual Address) non deve essere confuso con i comuni indirizzi virtuali. Un indirizzo RVA è l'indirizzo virtuale di un oggetto del file una volta che esso è stato caricato in memoria, meno l'indirizzo di base del file immagine. Se il file deve essere mappato fedelmente dal disco alla memoria, l'RVA sarà identico all'offset nel file, ma questo in realtà è piuttosto insolito.
Notare che il termine RVA è usato solo per gli oggetti nel file immagine. Una volta caricati in memoria, viene aggiunto l'indirizzo di base del file immagine, e sono usati gli ordinari indirizzi virtuali.