# Librerie condivise

Raccolte di codice che possono essere riutilizzate da altri programmi. In base a come il *linker* collega le librerie ai vari file oggetto (codice macchina generato dal compilatore), si hanno due tipi di librerie.

## Librerie statiche 

Una libreria statica viene unita al programma. Una copia del codice della libreria e' inglobata nel programma e ne diventa parte. Non ha quindi dipendenze esterne.

## Librerie dinamiche (o condivise)

Il *linker* si occupa solamente che il programma faccia riferimento alle librerie. In fase di esecuzione, la libreria deve essere disponibile per soddisfare le dipendenze del programma. 

## Denominazione

Il nome di una libreria dinamica/condivisa, o *soname*, segue la seguente nomenclatura:

- nome della libreria, preceduto da *lib*
- so (*share object*)
- numero di versione. I nomi delle librerie statiche terminano con *.a*

Ad esempio: libthread.so.0 oppure libthread.so.a

## Posizione nel filesystem

- `/lib`
- `/lib32`
- `/lib64`
- `/usr/lib`
- `/usr/local/lib`

### Configurazione dei percorsi delle librerie condivise

Quando un programma viene eseguito, il linker dinamico ricerca le librerie in una serie di directory, in particolare `/etc/ld.so.conf.d/` e nel file `/etc/ld.so.conf`, che semplicemente include tutti i file .conf presenti nella cartella sopra indicata:

```bash
cat /etc/ld.so.conf

include /etc/ld.so.conf.d/*.conf
```
La directory `/etc/ld.so.conf.d/` contiene una serie di file .conf che indicano i percorsi assoluti delle directory che contengono le librerie condivise. 

Il comando `ldconfig` si occupa della lettura di questi file di configurazione e della creazione dei vari link simbolici. Deve quindi essere eseguito ogni volta che vengono aggiunti o aggiornati dei file di configurazione. 

La variabile `LD_LIBRARY_PATH` puo' essere usata per aggiungere temporaneamente dei percorsi alle librerie condivise. 

```bash
LD_LIBRARY_PATH=/usr/local/mylib

export LD_LIBRARY_PATH # Aggiunge /usr/local/mylib al percorso delle librerie condivise per la shell corrente e lo esporta a tutti i processi figli L'aggiunta al file ~/.bashrc o /etc/bash rende la libreria persistente

unset LD_LIBRARY_PATH # Rimuove la variabile d'ambiente
```

> Il comando `export` esporta il valore di una variabile d'ambiente anche alle shell figlie.

### Ricerca delle dipendenze

Per la ricerca delle dipendenze, usare il comando `ldd` seguito dal percorso assoluto del programma. Ad esempio: `ldd /usr/bin/git`.