2.4 KiB
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:
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.
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
.