[hack] Idee un po' piu' chiare

Gianni Bianchini giannibi@firenze.linux.it
Sab 18 Ott 2003 10:37:15 CEST


Ciao, qualche piccolo chiarimento su alcune questioni venute fuori
ieri sera al corso (stanotte ho studiato! :) )

1) Si puo', al momento del link, specificare un percorso di ricerca
delle librerie condivise per un dato eseguibile, in modo che esso vada
a cercarsele in un posto prefissato, oltre a quelli definiti da
LD_LIBRARY_PATH e /etc/ld.so.conf. Esiste la direttiva rpath del
linker che fa proprio questo. Nell'esempio di ieri sera, compilavamo
il programmino di prova con

gcc -o esempio main.c mess1.o seno.o -L. -lm -lmess2

dalla directory /home/giannibi/c/esempio, dove risiede la shared
library libmess2.so, e nel lanciarlo ottenevamo l'errore

./esempio: error while loading shared libraries: libmess2.so: cannot
open shared object file: No such file or directory

a meno che non mettessimo /home/giannibi/c/esempio in LD_LIBRARY_PATH.
Se compiliamo con

gcc -Wl,--rpath -Wl,/home/giannibi/c/esempio -o esempio main.c \ 
    mess1.o seno.o -L. -lm -lmess2

diciamo al linker di "cablare" /home/giannibi/c/esempio nel percorso
di ricerca delle librerie di quell'eseguibile, che quindi funzionera'
allegramente senza accorgimenti (purche' la libreria resti li')

2) Se esistono due versioni, una statica e una dinamica, di libmess2
(libmess2.a, libmess2.so) ed entrambe hanno le stesse possibilita' di
essere trovate, ad es. sono nella stessa directory e diamo la linea di
comando di cui sopra, il linker predilige il collegamento dinamico, a
meno che non lo istruiamo altrimenti con la direttiva --static.
Comunque questa faccenda e' un putiferio e ci sono mille e una maniera
per cambiare il comportamento del linker.

3) Uno oggetto di una libreria condivisa viene caricato in memoria
una sola volta in presenza di piu' processi che lo richiedono limitatamente 
a cio' che non viene modificato dai processi stessi, ad esempio il
codice eseguibile stesso (shared text). I dati statici (static data),
che ovviamente devono essere relativi al singolo processo ma che sono
strutture e variabili introdotte dalla libreria, sono replicati. Anche
qui i dettagli sono un putiferio, e li rimandiamo al corso di "linux
bastardo", a cui mi iscrivo fin da ora. Hal, cerca i relatori. :)

Ciao.
Gianni.




Maggiori informazioni sulla lista golem-hack