Ar (Unix)
# Ar (Unix)

L'archiver (noto anche come ar) è un tool Unix che mantiene gruppi di file come un unico file di archivio. Attualmente ar è solitamente utilizzato per creare ed aggiornare solamente file di libreria che il linker usa. Possono essere utilizzati per creare archivi di ogni genere, ma è stato generalmente rimpiazzato dal formato di file tar per scopi che vanno oltre il linking di librerie. ar è incluso come una delle GNU Binutils.

## Esempi

Per esempio, per creare un archivio dai file class1.o, class2.o, class3.o, bisogna usare il seguente comando:

per compilare un programma che dipende da class1.o, class2.o, and class3.o si può fare:

invece di:

Il parametro -L e -l istruisce il linker per cercare la libreria "libclass.a" nella directory corrente.

## Dettagli sul formato del file

Il formato ar non è mai stato standardizzato, archivi recenti sono basati su un formato comune con due varianti conosciute, BSD e GNU.

Storicamente ci sono state altre varianti che includono AIX (small), AIX (big) e Coherent, variano significativamente dal formato comune.

Gli archivi deb usano il formato comune.

Un file ar inizia con una intestazione globale, seguita da una sezione di intestazione e dati per ogni file immagazzinato nel file ar.

La sezione di dati è allineata su 2 byte, se finisce con un formato dispari si riempie con un "\n".

### Intestazione globale

L'intestazione globale è un singolo campo che contiene la stringa ASCII "!<arch>" seguita da un singolo carattere di controllo LF.

### Intestazione di File

Il formato comune è come segue.

| Field Offset from | Field Offset to | Field Name | Field Format |
| - | - | - | - |
| 0 | 15 | File name | ASCII |
| 16 | 27 | File date | Decimal |
| 28 | 33 | Owner ID | Decimal |
| 34 | 39 | Group ID | Decimal |
| 40 | 47 | File mode | Octal |
| 48 | 57 | File size in bytes | Decimal |
| 58 | 59 | Header magic | '\n |

Per colpa delle limitazione sulla lunghezza e il formato dei file, sia la varianti GNU e BSD utilizzano metodi differenti per raggiungere nomi di file estesi.

**Variante BSD**

Gli ar BSD immagazzinano i nomi dei file estesi piazzando la stringa "#1/" seguita dalla lunghezza del nome del file nel campo del nome del file, e aggiungono il vero nome del file nell'intestazione del file.

**Variante GNU**

Gli ar GNU immagazzinano più nomi di file estesi nella sezione dei dati con il nome "//", questo record si riferisce a intestazioni successive. Una intestazione referenzia un nome di file esteso immagazzinando un "/" seguito da uno spiazzamento decimale all'inizio del nome del file nella sezione dei dati del file esteso.

L'ar GNU usa un '/' per segnare la fine di un nome di file, questo permette l'uso di spazi senza l'uso di un filename esteso.

L'ar GNU usa il nome di file speciale "/ " per far notare che le seguenti informazioni sui dati contengono una tabella di lookup di simboli, che viene usata nelle librerie ar per velocizzarne l'accesso

