1. Introduzione

Il presente HOWTO per programmatori discute come creare ed utilizzare librerie di programma in ambiente Linux utilizzando l'insieme di strumenti GNU. Una "libreria di programma" consiste semplicemente in un file contenente codice compilato (e dati) che viene successivamente incorporato in un programma; le librerie di programma consentono ai programmi di essere più modulari, più veloci da ricompilare e più semplici da aggiornare. Le librerie di programma possono essere divise in tre categorie: librerie statiche, librerie condivise e librerie a caricamento dinamico (DL, dall'inglese "dynamically loaded").

Questo articolo discute inizialmente le librerie statiche, le quali vengono installate in un programma eseguibile prima che il programma stesso possa essere mandato in esecuzione. Vengono successivamente discusse le librerie condivise, che vengono caricate all'avvio del programma e condivise tra i programmi. Infine, si discutono le librerie caricate dinamicamente (DL), le quali possono essere caricate ed utilizzate in ogni momento durante l'esecuzione di un programma. Le librerie dinamiche non corrispondono in realtà ad un differente formato di libreria (sia le librerie statiche che quelle condivise possono essere utilizzate come librerie a caricamento dinamico); piuttosto, la differenza sta in come le librerie dinamiche vengono utilizzate dai programmatori. L'HOWTO si conclude con una sezione contenente ulteriori esempi ed una sezione con riferimenti ad altre fonti di informazione.

La maggior parte dei programmatori intenzionati a sviluppare librerie dovrebbe creare librerie condivise, dal momento che queste consentono agli utenti di aggiornare le loro librerie separatamente dalle applicazioni che le utilizzano. Le librerie caricate dinamicamente sono utili, ma richiedono un certo lavoro in più per essere utilizzate e molti programmi non necessitano della flessibilità offerta da questo tipo di libreria. Al contrario, l'aggiornamento di librerie statiche risulta di gran lunga più complesso, tanto che un loro utilizzo generale risulta difficile da raccomandare. Detto questo, ogni categoria presenta dei vantaggi specifici; i pregi di ciascun tipo di libreria sono illustrati nella sezione dedicata. Gli sviluppatori che utilizzano il C++ e le librerie caricate dinamicamente dovrebbero inoltre consultare il "C++ dlopen mini-HOWTO".

Vale la pena di notare che alcuni utilizzano il termine DLL (dynamically linked libraries, cioè librerie collegate dinamicamente) per riferirsi alle librerie condivise, altri usano il termine DLL per indicare qualunque libreria che venga utilizzata come una libreria a caricamento dinamico e alcuni altri intendendo un tipo di libreria che corrisponde ad entrambi i significati. Indipendentemente da quale significato venga scelto, il presente HOWTO tratta le DLL in ambiente Linux.

Per quanto riguarda il formato di eseguibili e librerie, questo HOWTO discute unicamente il formato ELF (Executable and Linking Format), utilizzato attualmente dalla quasi totalità di distribuzioni Linux. L'insieme di strumenti GNU gcc può in realtà gestire formati di librerie diversi da ELF; in particolare la maggior parte di distribuzioni Linux può ancora utilizzare l'obsoleto formato a.out. In ogni caso, tali formati esulano dalla portata del presente articolo.

Se si deve implementare un'applicazione che deve essere portata su molti sistemi, in alternativa all'uso diretto degli strumenti di Linux, può essere preso in considerazione, al fine di compilare ed installare librerie, l'utilizzo di GNU libtool. GNU libtool è uno script di supporto alla produzione di librerie che maschera la complessità nell'utilizzo di librerie condivise (riguardo, ad esempio, alla creazione ed installazione delle stesse) dietro un'interfaccia consistente e portabile. Sotto Linux, GNU libtool è implementato sulla base degli strumenti e delle convenzioni descritte nel presente HOWTO. Per le librerie caricate dinamicamente è possibile utilizzare differenti strumenti che ne incapsulano le funzionalità dietro un'interfaccia portabile. GNU libtool include uno di questi strumenti, chiamato "libtdl". In alternativa, è possibile utilizzare la libreria glib (da non confondersi con glibc) con il suo supporto portabile al caricamento dinamico di moduli. È possibile reperire ulteriori informazioni riguardo a glib presso http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html. Ancora una volta, sotto Linux questa funzionalità è implementata utilizzando i costrutti descritti in questo HOWTO. Se si sta effettivamente sviluppando il codice in ambiente Linux si vorranno probabilmente avere a disposizione le informazioni contenute nel presente articolo.

La copia di riferimento di questo HOWTO è disponibile presso http://www.dwheeler.com/program-library, e fa parte del Linux Documentation Project (http://www.linuxdoc.org). È Copyright (C) 2000 di David A. Wheeler e se ne fornisce licenza d'uso secondo i termini della General Public License (GPL); si rimanda alla sezione conclusiva per ulteriori informazioni.