Mai fidarsi di un computer che non è possibile gettare dalla finestra.

— Steve Wozniak

Librerie statiche e dinamiche in ambiente Linux

Vediamo ora come è possibile creare una libreria statica con i tool ar e ranlib.

Ar, il cui acronimo sta per archiver (si noti la somiglianza con il comando tar), è un tool usato per la creazione di librerie statiche (che sono in realtà dei semplici archivi), per modificare i file oggetto in esse presenti ed elencarne i nomi. Per creare una libreria statica è possibile far uso di un comando simile a questo:

ar rc libmylib.a myfile1.o myfile2.o myfile3.o

Questo comando crea una libreria statica chiamata libmylib.a e mette copie dei file oggetto myfile1.o, myfile2.o e myfile3.o in essa. Se il file di libreria è già esistente, i file oggetto saranno inseriti in essa mentre se esistono anche i file oggetto nella libreria saranno sostituiti con le nuove copie. Questi comportamenti del comando ar sono gestiti dal flag c (create) che consente la creazione di un archivio nel caso in cui non sia già esistente e dal flag r (replace) che dice ad ar di sostituire i vecchi file oggetto con le nuove versioni.

Dopo aver creato o modificato un archivio è necessario indicizzarlo. L’indicizzazione delle librerie è sfruttata dal compilatore per velocizzare la ricerca dei simboli nella libreria e per verificare che l’ordine dei simboli nella libreria non creerà problemi in fase di linking (questo aspetto sarà trattato in maniera più approfondita nei prossimi articoli). Per portare a termine questa operazione ci viene in aiuto il comando ranlib che può essere usato come mostrato di seguito:

ranlib libmylib.a

Su alcuni sistemi il comando ar si occupa di indicizzare la libreria cosicché risulta futile l’uso di ranlib; un esempio di questo genere è rappresentato dal compilatore C della Sun, che crea archivi già indicizzati. Inoltre è possibile anche sostituire il comando precedentemente utilizzato per la creazione dell’archivio come mostrato a seguire:
ar rcs libmylib.a myfile1.o myfile2.o myfile3.o

In questo comando il flag s sta ad indicare che l’archivio sarà indicizzato. Tuttavia, poichè molti pacchetti software fanno ancora uso di ranlib, alcune piattaforme supportano un comando ranlib che non fa nulla. In questo modo è possibile usare lo stesso Makefile su diversi tipi di piattaforme.

Nota: quando la data di generazione dell’indice dell’archivio (memorizzata all’interno del’archivio) è meno recente della data di ultima modifica del file (memorizzata nel file system), il compilatore, cercando di utilizzare tale libreria, considererà il suo indice out of date ovvero non aggiornato e perciò terminerà la propria esecuzione senza linkare correttamente la libreria. Ci sono due modi per superare questo problema:

  • Usare ranlib per rigenerare l’indice in maniera tale che il file di indice avrà una data di generazione (memorizzata nell’archivio) più recente rispetto alla data di modifica del file (memorizzata nel file system).
  • Quando si copia l’archivio del file in un’altra posizione digitare il comando cp -p; il flag -p comunicherà a cp di mantenere tutti gli attributi del file, includendo i suoi permessi di accesso, il proprietario (se cp è stato lanciato da superuser) e la data dell’ultima modifica. In questo modo il compilatore penserà che l’indice dell’archivio è aggiornato. Questa soluzione è adatta quando i Makefile necessitano di copiare la libreria in un’altra cartella.