La documentazione è come il sesso; quando è ben fatta è davvero ben fatta, altrimenti... è meglio che niente.

— Dick Brandon

Librerie statiche e dinamiche in ambiente Linux

Vediamo ora come usare una libreria dinamica.

Una libreria dinamica può essere utilizzata in due modi differenti:

  • 1. In fase di compilazione - In tal caso è possibile impostare il linker affinchè esegua una ricerca nella libreria durante la creazione dell’eseguibile, in maniera tale da controllare che siano presenti tutti i simboli presenti nel programma da compilare.
  • 2. In fase di esecuzione - In tal caso è necessario impostare il dynamic loader di sistema (il processo incaricato di caricare automaticamente e linkare le librerie dinamiche nel processo di esecuzione), comunicandogli dove trovare le librerie dinamiche di cui vogliamo fare uso.

La prima alternativa è senza dubbio la più semplice e risulta molto simile alla procedura illustrata per le librerie statiche. Un esempio di comando sarebbe:

cc main.o -L. -lmylib -o myprog

Il linker cercherà il file libmylib.so (-lmylib) creato precedentemente nella directory corrente (-L.) e la collegherà al programma, non inserendo i suoi file oggetto all’interno del file eseguibile risultante, prog.

La seconda soluzione risulta un pò più complessa. Normalmente, il loader dinamico del sistema cerca librerie dinamiche in alcune directory specifiche di sistema (ad esempio /lib, /usr/lib, /usr/X11/lib e così via). Quando creiamo una nuova libreria dinamica che non fa parte del sistema, per consentire al dynamic loader di cercare anche in altre directory è possibile usare la variabile d’ambiente LD_LIBRARY_PATH. Per controllare se la variabile è già definita sul sistema è necessario eseguire il seguente comando:

echo $LD_LIBRARY_PATH

Se si ottiene un messaggio del tipo LD_LIBRARY_PATH: Undefined variable, allora la variabile non risulta definita.

In base alla shell che si sta utilizzando è possibile definire questa variabile nei seguenti modi:

  • 1. tcsh o csh, se LD_LIBRARY_PATH non è definita:
setenv LD_LIBRARY_PATH /full/path/to/library/directory
  • 2. tcsh o csh, se LD_LBRARY_PATH risulta già definito
setenv LD_LIBRARY_PATH /full/path/to/library/directory:${LD_LIBRARY_PATH}
  • 3. sh, bash e similari, se LD_LIBRARY_PATH non è definita
LD_LIBRARY_PATH=/full/path/to/library/directory
export LD_LIBRARY_PATH
  • 4. sh, bash e similari se LD_LIBRARY_PATH risulta già definito
LD_LIBRARY_PATH=/full/path/to/library/directory:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH

Dopo aver definito LD_LIBRARY_PATH, è possibile controllare se il sistema riesce a trovare la libreria provando a linkare un programma con questa libreria con il comando che segue:

ldd prog

Questo comando avrà come output poche linee, ciascuna delle quali riporta il nome di una libreria e il corrispondente percorso sulla propria destra. Se una libreria non è trovata in nessuna delle directory di default del sistema, o nelle directory menzionate in LD_LIBRARY_PATH, sarà visualizzato a video un mesaggio library not found. Se tutto va a buon fine è possibile lanciare il programma.

Per un esempio di programma che usa una libreria dinamica è possibile dare un’occhiata qui.