lpic/101/006_librerie_condivise.md

58 lines
2.4 KiB
Markdown
Raw Permalink Normal View History

2024-10-21 21:48:47 +02:00
# 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`.