La documentazione è come il sesso; quando è ben fatta è davvero ben fatta, altrimenti... è meglio che niente.

— Dick Brandon

Librerie statiche e dinamiche in ambiente Linux

Per capire i meccanismi che ci sono dietro il linking ed essere in grado di superare eventuali problemi è necessario addentrarsi più a fondo nell’argomento. Uno degli errori più frequenti riguarda l’ordine delle librerie e dei file oggetto collegati all’eseguibile.

Bisogna tenere a mente che l’ordine in cui i file oggetto e le librerie vengono presentati al linker è lo stesso ordine in cui il linker li collega nel file binario risultante. Il linker controlla a turno ciascun file. Se si tratta di un file oggetto, viene collegato in toto al file eseguibile. Se invece è una libreria, il linker controllerà per vedere se ogni simbolo referenziato nel precedente file oggetto ma non definito in esso è contenuto nella libreria. Se un simbolo viene rilevato, il file oggetto dalla libreria che contiene il simbolo viene aggiunto al file eseguibile. Questo processo prosegue finchè non sono stati processati tutti i file oggetto e le librerie specificate.

In tal modo se la libreria A usa simboli presenti nella libreria B, allora la libreria A deve apparire nel comando di linking prima della libreria B. Tuttavia, i simboli potrebbero essere mancanti e il linker non tornerà mai indietro per prendere in considerazione librerie già processate. Se la libreria B usa simboli presenti anche nella libreria A, allora l’unico modo per assicurarsi che il linking sia andato a buon fine è menzionare la libreria A sul comando di link una seconda volta dopo la libreria B, in questo modo:

$(LD) ……. -lA -lB -lA

In tal modo la fase di linking risulterà più lenta in quanto la libreria A sarà processata due volte. Ciò comporta anche che non esistano due o più librerie con mutue dipendenze. Se sono presenti troppe dipendenze, allora è conveniente riprogettare i contenuti delle proprie librerie o combinarle in una libreria più grande.

Da notare che i file oggetto passati sulla linea di comando in fase di linking sono sempre inclusi interamente nel file eseguibile perciò l’ordine in cui sono specificati non ha realmente importanza. Una buona regola consiste nel menzionare sempre le librerie dopo tutti i file oggetto.

Prima di concludere con questa serie di articoli, facciamo un’ultima precisazione. Quando si è discusso delle librerie statiche è stato detto che il linker cerca di trovare un file di nome libmylib.a. In realtà ciò non è vero. Prima di cercare una libreria statica, il linker cercherà un file con il nome libmylib.so, ovvero una libreria dinamica. Solo se non riesce a trovare una libreria dinamica, cercherà la libreria statica libmylib.a. Così, se sono state create due copie della libreria, una statica e una dinamica, quella dinamica sarà la preferita. Questo può essere ignorato usando alcuni flag del linker; a seconda del linker in uso il flag in questione può essere -Wl,static oppure -Bstatic. Fare riferimento al manuale del compilatore o del linker per ulteriori dettagli su questi flag.