lpic/101/006_librerie_condivise.md
2024-10-21 21:48:47 +02:00

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.