erlug
[Top] [All Lists]

Re: [Erlug] Librerie - Conversioni

To: erlug@xxxxxxxxxxxxxx
Subject: Re: [Erlug] Librerie - Conversioni
From: Davide Bolcioni <db_erlug@xxxxxxxx>
Date: Sat, 03 Apr 2004 17:11:28 +0200
Titanicus ha scritto:

1) ho un programma che ha bisogno di una libreria, ma mi scoccia
occupare spazio con quella libreria solo per quel programma, così ho
pensato di compilarci le librerie in modo statico. Il fatto è che mi da
errori che per ora non vi dico, perché la mia domanda è: è possibile
trasformare un binario da linkato dinamicamente a linkato staticamente?

E' sempre possibile, ma può darsi che non sia una bella idea.

Cerco di spiegarmi meglio: nel 2004, le librerie sono di norma
condivise (shared object). Chi le sviluppa, di norma ha in mente un
uso come libreria condivisa e se fa test li fa sul caso della
libreria condivisa; in caso contrario *di solito lo dice* e spiega
come usare la libreria con linking statico. Alcune librerie C++, ad
esempio, sono per ragione sociale costituite da soli header e non
vanno condivise affatto: ma la cosa è sempre esplicita.

Ora, in teoria, tra link statico e link dinamico non c'è differenza;
d'altra parte, sempre in teoria, Windows funziona.

Non posso essere più preciso senza sapere di che libreria si tratta,
ma posso dare alcune indicazioni:
- se il Makefile non prevede un target per compilare la libreria
  staticamente, meglio lasciar perdere;
- conviene chiedere sulla mailing list di sviluppo della libreria
  stessa o contattare l'autore, che funzioni oggi non vuol dire che
  funzioni domani (nel senso che il binario scodellato presso il
  cliente smette di funzionare, tanto per essere chiari);
- in caso di librerie C++, il linking statico può mandare a farfalle
  l'ipotesi di ODR (One Definition Rule, ovvero che dato un oggetto
  esiste uno e un solo indirizzo di memoria a cui quell'oggetto si
  trova ed è lo stesso ovunque nel programma e per tutta la sua
  durata);
- le librerie di sistema, glibc e C++, non vanno mai linkate
  staticamente (escluso il caso di chi prepara una distribuzione e
  include mv, cp e compagnia linkati staticamente a fini di rescue);
- se la libreria gestisce una cache, usa memoria condivisa oppure
  semafori, probabilmente il link statico è una cattiva idea perchè
  potrebbe trovarsi nella situazione di avere *due* cache o semafori
  che pensa siano lo stesso semaforo e invece sono a indirizzi diversi.

Indicazione semplice: non linkare staticamente. Di solito il link
statico ha lo scopo di non affrontare la gestione delle dipendenze,
in base all'errato assunto che le dipendenze siano un capriccio di
qualche rompicoglioni e che "se il mio codice con questa versione
sul mio PC funziona, se li metto insieme e li tengo insieme poi
funzioneranno anche su qualunque macchina li installi". Certo:
tutti quelli che sviluppano librerie e curano le dipendenze sono
degli stupidi ossessionati dalla preoccupazione di risparmiare
lo spazio su disco. All the world is a VAX.

Quanto ho appena scritto può sembrare un pò uno sfogo, me ne scuso.

Davide Bolcioni
--
There is no place like /home.


<Prev in Thread] Current Thread [Next in Thread>