Dopo aver visto nella precedente puntata come creare una libreria dinamica, in questo articolo sarà illustrato come usare una libreria dinamica.
Una libreria dinamica può essere utilizzata in due modi differenti:
- 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.
- 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 nella precedente puntata 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:
- tcsh o csh, se LD_LIBRARY_PATH non è definita:
- setenv LD_LIBRARY_PATH /full/path/to/library/directory
- tcsh o csh, se LD_LBRARY_PATH risulta già definito
- setenv LD_LIBRARY_PATH /full/path/to/library/directory:${LD_LIBRARY_PATH}
- sh, bash e similari, se LD_LIBRARY_PATH non è definita
- LD_LIBRARY_PATH=/full/path/to/library/directory
export LD_LIBRARY_PATH - 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 quì.
PUNTATE PRECEDENTI:
8 Febbraio 2008: Librerie statiche e dinamiche in ambiente Linux (1/8)
19 Febbraio 2008: Librerie statiche e dinamiche in ambiente Linux (2/8)
27 Febbraio 2008: Librerie statiche e dinamiche in ambiente Linux (3/8)
3 Marzo 2008: Librerie statiche e dinamiche in ambiente Linux (4/8)
di Francesco Argese - TuxJournal.net