Ricerca nel sito web

Comprendere le librerie condivise in Linux


Nella programmazione, una libreria è un assortimento di pezzi di codice precompilati che possono essere riutilizzati in un programma. Le librerie semplificano la vita ai programmatori, in quanto forniscono funzioni riutilizzabili, routine, classi, strutture dati e così via (scritte da un altro programmatore), che possono utilizzare nei loro programmi.

Ad esempio, se stai creando un'applicazione che deve eseguire operazioni matematiche, non devi creare una nuova funzione matematica per questo, puoi semplicemente utilizzare le funzioni esistenti nelle librerie per quel linguaggio di programmazione.

Esempi di librerie in Linux includono libc (la libreria C standard) o Glibc (versione GNU della libreria C standard), libcurl (file multiprotocollo libreria di trasferimento), libcrypt (libreria utilizzata per crittografia, hashing e codifica in C) e molti altri.

Linux supporta due classi di librerie, vale a dire:

  • Librerie statiche: sono legate staticamente a un programma in fase di compilazione.
  • Librerie dinamiche o condivise: vengono caricate quando un programma viene avviato e caricato in memoria e l'associazione avviene in fase di esecuzione.

Le librerie dinamiche o condivise possono essere ulteriormente classificate in:

  • Librerie collegate dinamicamente: qui un programma è collegato alla libreria condivisa e il kernel carica la libreria (nel caso in cui non sia in memoria) al momento dell'esecuzione.
  • Librerie caricate dinamicamente: il programma assume il pieno controllo richiamando funzioni con la libreria.

Convenzioni per la denominazione delle librerie condivise

Le librerie condivise vengono denominate in due modi: il nome della libreria (noto anche come soname) e un "nome file" (percorso assoluto del file in cui è memorizzato il codice della libreria).

Ad esempio, il soname per libc è libc.so.6: dove lib è il prefisso, c è un nome descrittivo, quindi significa oggetto condiviso e 6 è la versione. E il suo nome file è: /lib64/libc.so.6. Nota che il soname è in realtà un collegamento simbolico al nome del file.

Individuazione delle librerie condivise in Linux

Le librerie condivise vengono caricate da ld.so (o ld.so.x) e ld-linux.so (o ld- linux.so.x), dove x è la versione. In Linux, /lib/ld-linux.so.x cerca e carica tutte le librerie condivise utilizzate da un programma.

Un programma può chiamare una libreria utilizzando il nome della libreria o del file e un percorso della libreria memorizza le directory in cui è possibile trovare le librerie nel filesystem. Per impostazione predefinita, le librerie si trovano in /usr/local/lib, /usr/local/lib64, /usr/lib e /usr/lib64; le librerie di avvio del sistema si trovano in /lib e /lib64. I programmatori possono, tuttavia, installare le librerie in posizioni personalizzate.

Il percorso della libreria può essere definito nel file /etc/ld.so.conf che puoi modificare con un editor da riga di comando.

vi /etc/ld.so.conf 

Le righe in questo file indicano al kernel di caricare il file in /etc/ld.so.conf.d. In questo modo, i manutentori o i programmatori dei pacchetti possono aggiungere le directory delle loro librerie personalizzate all'elenco di ricerca.

Se guardi nella directory /etc/ld.so.conf.d, vedrai i file .conf per alcuni pacchetti comuni (kernel, mysql e postgresql in questo caso):

ls /etc/ld.so.conf.d

kernel-2.6.32-358.18.1.el6.x86_64.conf  kernel-2.6.32-696.1.1.el6.x86_64.conf  mariadb-x86_64.conf
kernel-2.6.32-642.6.2.el6.x86_64.conf   kernel-2.6.32-696.6.3.el6.x86_64.conf  postgresql-pgdg-libs.conf

Se dai un'occhiata a mariadb-x86_64.conf, vedrai un percorso assoluto alle librerie dei pacchetti.

cat mariadb-x86_64.conf

/usr/lib64/mysql

Il metodo sopra imposta il percorso della libreria in modo permanente. Per impostarlo temporaneamente, utilizza la variabile di ambiente LD_LIBRARY_PATH sulla riga di comando. Se vuoi mantenere le modifiche permanenti, aggiungi questa riga nel file di inizializzazione della shell /etc/profile (globale) o ~/.profile (specifico dell'utente).

export LD_LIBRARY_PATH=/path/to/library/file

Gestione delle librerie condivise in Linux

Vediamo ora come gestire le librerie condivise. Per ottenere un elenco di tutte le dipendenze della libreria condivisa per un file binario, puoi utilizzare l'utilità ldd. L'output di ldd è nel formato:

library name =>  filename (some hexadecimal value)
OR
filename (some hexadecimal value)  #this is shown when library name can’t be read

Questo comando mostra tutte le dipendenze della libreria condivisa per il comando ls.

ldd /usr/bin/ls
OR
ldd /bin/ls
Uscita del campione
	linux-vdso.so.1 =>  (0x00007ffebf9c2000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000)
	librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000)
	libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000)
	libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000)
	/lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000)
	libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)

Poiché le librerie condivise possono esistere in molte directory diverse, la ricerca in tutte queste directory quando viene avviato un programma sarebbe molto inefficiente: il che è uno dei probabili svantaggi delle librerie dinamiche. Viene quindi utilizzato un meccanismo di caching, eseguito dal programma ldconfig.

Per impostazione predefinita, ldconfig legge il contenuto di /etc/ld.so.conf, crea i collegamenti simbolici appropriati nelle directory dei collegamenti dinamici e quindi scrive una cache in /etc/ld.so.cache che viene poi facilmente utilizzato da altri programmi.

Questo è molto importante soprattutto quando hai appena installato nuove librerie condivise o ne hai create di tue, o hai creato nuove directory di librerie. È necessario eseguire il comando ldconfig per rendere effettive le modifiche.

ldconfig
OR
ldconfig -v 	#shows files and directories it works with

Dopo aver creato la tua libreria condivisa, devi installarla. Puoi spostarlo in una qualsiasi delle directory standard menzionate sopra ed eseguire il comando ldconfig.

In alternativa, esegui il comando seguente per creare collegamenti simbolici dal soname al nome file:

ldconfig -n /path/to/your/shared/libraries

Per iniziare a creare le tue librerie, consulta questa guida di The Linux Documentation Project (TLDP).

È tutto per ora! In questo articolo ti abbiamo presentato un'introduzione alle librerie, spiegato le librerie condivise e come gestirle in Linux. Se hai domande o ulteriori idee da condividere, utilizza il modulo dei commenti qui sotto.