>
MENU
ajax_logo.gif

AJAX: Asynchronous JavaScript Technology and XML (1/3)

Alla scoperta del file system di Linux

14 marzo 2008 Visualizzazioni: 997 Focus

Librerie statiche e dinamiche in ambiente Linux (5/8)

Dopo aver visto nella precedente puntata come creare una libreria dinamica, in questo articolo sarà illustrato come usare una libreria dinamica.

libreria

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 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:

  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 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

twittergoogle_pluslinkedinmail
  • davide

    ciao
    complimenti per la guida
    ho provato ad usare i file del programma che hai messo in download

    eseguendo il makefile sembra andare tutto a buon fine ma eseguendo il prog mi dice:

    davide@ubuntu:~/Proggrammazione/programmazione$ ./prog
    Inside main()
    ./prog: symbol lookup error: ./prog: undefined symbol: util_file
    davide@ubuntu:~/Proggrammazione/programmazione$ nm /usr/lib/libutil.so
    nm: /usr/lib/libutil.so: no symbols
    davide@ubuntu:~/Proggrammazione/programmazione$