[Tech] librerie di funzioni in c

Alessio Frusciante algol@tin.it
Gio 1 Lug 2004 13:10:45 CEST


Oggi Valerio Montagnani ha scritto:

>1. come si costruisce una libreria di funzioni? 
>2. cosa significa scrivere codice in formato rilocabile?
>3. cosa devo leggere a rigurdo, per documentarmi?

Il discorso sarebbe lungo, ti posso fare una velocissima carrellata sulla
questione. Siccome non ho riprovato i comandi potrei aver fatto degli
errori di sintassi, leggiti comunque le pagine man.
Farei subito una distinzione tra librerie statiche e librerie condivise.
Una libreria statica e` un "pacchetto" di normali file oggetto, che ciascun
programma puo` linkare in maniera classica. Una libreria condivisa e`
qualcosa di un po' piu` complicato, che ciascun programma linka a run-time.
Il vantaggio di una libreria condivisa e` che non viene inclusa
nell'eseguibile, quindi se, ad esempio, tu hai 10 programmi che linkano
le
stesse funzioni del C, nel caso di una libreria statica avrai dieci copie
dei moduli che contengono tali funzioni (all'interno di ciascun
eseguibile), mentre nel caso di una libreria condivisa ne avrai una sola
copia. Inoltre c'e` un altro vantaggio in termini di codice caricato in
memoria, che vedremo dopo.

Creare una libreria statica e` semplice, prendi n file oggetto e fai cosi`:

ar -rcs libmialibreria.a file1.o file2.o file3.o

Per maggiori informazioni vedi la pagina man del comando ar. In ogni caso
ar e` qualcosa di concettualmente molto simile a tar, impacchetta i file
oggetto in un solo file.

Per quanto riguarda una libreria condivisa, invece, si richiede di avere
codice indipendente dalla posizione in cui viene caricato, perche' questo
permette di tenere una sola copia della libreria in memoria.
Per fare cio`, durante la generazione del file oggetto si deve utilizzare
uno switch di compilazione del gcc, -PIC:

gcc -fPIC -c file1.c

quando hai tutti i tuoi file oggetto non devi usare ar, ma direttamente
il
gcc:

gcc -shared -Wl,-soname,libmialibreria.so.1 -o libmialibreria.so.1.0.1
file1.o file2.o file3.o

o il linker:

ld -shared -soname libmialibreria.so.1 -o libmialibreria.so.1.0.1 file1.o
file2.o file3.o

Il soname (SO significa Shared Object) e` un nome convenzionale, che
tipicamente comincia con lib, ha un suffisso .so e un numero che dovrebbe
cambiare solo quando cambia l'interfaccia. Invece il nome che dai dopo -o
e` proprio il nome del file, che e` tipicamente il soname piu` due
numeretti (minor number e release number). Un programma, quando linka una
libreria dinamica usa il suo soname meno il numero di versione, sara` poi
il linker dinamico a trovarti la libreria che ti serve (se il sistema e`
opportunamente configurato).

Come si usano le librerie?
Tramite lo switch -l di gcc:

gcc -o programma file1.o file2.o -lmialibreria

Ci sarebbero molti altri particolari, ad esempio il caricamento dinamico
delle librerie condivise, come farle vedere al sistema, per cui ti rimando
al Program Library HOWTO:

http://www.dwheeler.com/program-library

Se hai altre domande, chiedi pure.

Ciao
Alessio




Maggiori informazioni sulla lista flug-tech