Computer: cretino ad alta velocità in dotazione, spesso, a cretini molto lenti.

— Stefano Benni

Librerie statiche e dinamiche in ambiente Linux

http://www.stenoweb.it/files/blog/linuxprogramming.jpg Uno dei problemi più diffusi nella progettazione del software - con particolare riferimento a quello open source, in quanto collaborativi - riguarda la crescita esponenziale e quotidiana del codice. Ciò può dare origine a problemi in fase di compilazione e di linking perciò è necessario in primis definire delle linee guida per la gestione del codice del progetto. Per la risoluzione di tale problematica può essere d’aiuto agli sviluppatori l’utility make, che consente di automatizzare la fase di compilazione. Spesso e volentieri a questa utility viene associato uno script di configurazione con l’obiettivo di gestire le dipendenze e di estendere la portabilità sui sistemi Unix-Like.
Inoltre quando le dimensioni del codice crescono a dismisura e quando ci sono in ballo più programmatori risulta necessario organizzare il proprio progetto separando il codice sorgente in pezzi di codice di più piccole dimensioni che possano essere gestite con un file make (cui si fa riferimento con il nome di Makefile) separato da un programmatore differente. Ciò consente anche a più programmatori di lavorare sullo stesso progetto senza creare troppa confusione; si ricorda comunque che a tal scopo esistono molti sistemi di controllo versione tra cui uno dei più utilizzati al giorno d’oggi è SVN.

I compilatori aiutano lo sviluppatore nel suo lavoro tramite le librerie. Una libreria è un file contenente diversi file oggetto che possono essere usati come una singola entità in fase di linking di un programma. Di solito la libreria è indicizzata tramite opportuni comandi (uno dei più comuni è rappresentato da ranlib). In tal modo risulta più semplice e veloce trovare simboli (ad esempio variabili o funzioni nel programma). Per questo motivo il linking di un programma i cui file oggetto sono ordinati in librerie è molto pù veloce del linking di un programma i cui file oggetto sono memorizzati separatamente. Inoltre quando si ha una libreria ci sono meno file da ricercare ed aprire e ciò velocizza ulteriormente la fase di linking.

I sistemi Unix (così come la maggior parte dei sistemi moderni) consentono la creazione di due tipi di librerie: le librerie statiche e le librerie dinamiche (anche chiamate condivise). Le librerie statiche sono collezioni di file oggetto collegati al programma durante le fase di linking e quindi non sono rilevanti durante l’esecuzione dell’applicazione. Le librerie condivise, al contrario, non sono contenute nel file eseguibile creato ma sono caricate dal dynamic loader (solitamente /lib/ld-linux.so.2 nei sistemi Unix) in memoria che quando viene avviata un’applicazione si occupa di controllare le librerie condivise collegate con l’applicativo, le carica in memoria, e le attacca alla copia del programma in memoria.

La complessa fase di caricamento dinamico rende l’avvio dei programmi più lento ma questo problema è trascurabile se si pensa al grande vantaggio che offre questa soluzione. Se viene eseguito un secondo programma collegato con la stessa libreria, viene usata la stessa copia della libreria condivisa, risparmiando una notevole quantià di memoria. Si pensi alla libreria C standard: di solito è una libreria condivisa ed è usata da tutti i programmi C. Con questo meccanismo in ogni istante sarà presente solo una copia della libreria memorizzata in memoria. In questo modo ogni programma può far uso di meno memoria per essere eseguito e gli eseguibili sono di dimensioni più ragguardevoli, consentendo di risparmiare spazio su disco.

Tuttavia c’è un ulteriore problema relativo a questo modus operandi. Se la libreria dinamica viene ricompilata e si prova a mandare in esecuzione una seconda copia del programma con la nuova libreria, otterremo una risultato non gradito: il dynamic loader si accorgerà che una copia della libreria è già memorizzata, così la attaccherà al programma e non caricherà la nuova versione modificata dal disco. Comunque, come si vedrà nei prossimi articoli, esistono tecniche per evitare questi comportamenti non desiderati.