# 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`.