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

3 marzo, 2008 2 Commenti »

In questa quarta puntata sarà illustrato come creare una libreria dinamica. Il procedimento non si discosta molto da quanto visto per le librerie statiche.

libreria

Tuttavia ci sono alcune differenze significative tra i due tipi di librerie come era già stato anticipato nel primo articolo. Un primo aspetto che differisce consiste nel cosiddetto PIC, il cui acronimo sta per Position Independent Code. Una definizione molto chiara viene data da Wikipedia):

“In informatica, per codice indipendente dalla posizione (PIC, Position-Independent Code) o eseguibile indipendente dalla posizione (PIE, Position-Independent Executable) s’intende del codice oggetto che può essere eseguito in differenti locazioni in memoria. Il codice PIC è comunemente usato per librerie condivise, in modo da permettere che la stessa libreria possa essere mappata in una locazione di memoria unica per ogni applicazione (usando il sistema della memoria virtuale) dove non può sovrapporsi all’applicazione o ad altre librerie condivise. Il codice PIC è stato utilizzato anche su vecchi sistemi senza supporto MMU, in modo da permettere al sistema operativo di poter mantenere le applicazioni reciprocamente separate.

Il codice indipendente dalla posizione può essere copiato in ogni locazione di memoria senza modifiche ed esecuzioni, contrariamente dal codice rilocabile, che necessità di una analisi speciale da parte di un link editor oppure di un program loader per renderlo adatto all’esecuzione in una data locazione. Il codice deve essere generalmente scritto o compilato in un modo particolare per renderlo indipendente dalla posizione. Le istruzioni che riferiscono ad indirizzi di memoria specifici, come salti assoluti, devono essere sostituite con operazioni equivalenti ma relative al program-counter. L’indirezione aggiuntiva può causare al codice PIC di essere meno efficiente, anche se i moderni processori sono progettati per apportare migliorie in tal senso.”

Per compilare con l’opzione PIC è necessario compilare i file sorgente specificando il flag -fPIC o -fpic.

Un’altra differenza sostanziale rispetto alle librerie statiche è che una libreria dinamica non è un archivio. Una libreria dinamica ha un formato specifico relativo all’architettura per la quale è stata creata; perciò è necessario usare il compilatore per generare la libreria (e non il comando ar come visto per le librerie statiche) e sarà necessario specificare che si desidera creare una libreria dinamica e non un file relativo ad un programma completo. Ciò può essere ottenuto tramite il flag -G con alcuni compilatori, o il flag -shared con altri.

Viene riportato di seguito un esempio riassuntivo che mostra come sia possibile creare una libreria dinamica.

cc -fPIC -c myfile1.c
cc -fPIC -c myfile2.c
cc -fPIC -c myfile3.c
cc -shared libmylib.so myfile1.o myfile2.o myfile3.o

I primi tre comandi compileranno i file sorgenti myfile1 myfile2 e myfile3 generando rispettivamente i file oggetto myfile1.o myfile2.o e myfile3.o con l’opzione -fpic, in maniera tale che siano disponibili per essere inclusi in una libreria condivisa (potrebbero anche essere linkati direttamente senza la creazione della libreria dinamica). L’ultimo comando si occupa di generare la libreria condivisa libmylib.so.

Nella prossima puntata sarà mostrato come utilizzare una libreria dinamica in un programma.

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)

di Francesco ArgeseTuxJournal.net

Potrebbero interessarti ...