Newsgroup: it.comp.os.linux.development
Titolo: Librerie dinamiche

Salve a tutti.
Sono un Linux-utente da qualche mese, e sto studiando per diventare
Linux-programmatore.
Se non ho capito male la faccenda, ogni programma tipicamente viene
collegato in
esecuzione alle svariate funzioni di cui può fare uso, provenienti dalle
librerie a collegamento dinamico.
Supponiamo che io voglia scrivere un insieme di programmi e una libreria
da loro
condivisa. Ho provato a farlo nel seguente modo.
1. Ho scritto due semplici listati:
    - abc.c: un programma senza la funzione main, destinato ad essere la
sorgente
	della libreria.
	- test_abc.c: un programma che usi le funzioni definite in abc.c.
2. Ho compilato la libreria con:
    cc -shared -o libabc.so abc.c
 
3. Ho compilato il programma con:
    cc -L"." -labc -o test_abc test_abc.c 
 
4. Ho aggiunto la riga con il path nel quale stavo lavorando al file
   /etc/ld.so.conf.
 
5. Ho lanciato ldconfig per far ricostruire la cache.
E a questo punto il programma, logicamente, funziona. Però in questo
approccio
ho notato una serie di svantaggi:
1. Ogni volta che aggiungo una libreria, devo far ricostruire la cache,
il che
sul mio P166 prende qualche minuto. Ma siccome potrebbe capitare poche
volte di
aggiungere una libreria, questo è il problema minore.
2. La libreria che ho scritto (anzi quella che vorrei scrivere)
servirebbe solo
ad un paio di programmi, e mi pare poco bello aggiungere il suo percorso
al file
ld.so.conf, che (credo) dovrebbe contenere i percorsi per librerie di
uso
generale.
3. Se voglio far installare il programma a qualcuno che non abbia
accesso come
root sul suo sistema, la cosa non si può fare.
La domanda allora è: è possibile usare le librerie dinamiche senza
alterare il
contenuto di ld.so.conf? 
Ho notato che un altro modo di caricare le librerie dinamiche è usare le
funzioni dlopen() e simili. La cosa sembra funzionare anche per le
librerie non
registrate in ld.so.conf, ma presenta due svantaggi:
1. L'uso di ldopen() e compagni sembra limitato alle funzioni: come
farei ad
usarlo con classi C++?
2. Non si hanno automaticamente informazioni sulle dipendenze con ldd.
(Questa è
naturalmente un'inezia.)
3. Il loro uso è parecchio scomodo e non si concilia con uno stile
semplice e
lineare di programmazione. 
Un'ultima nota: nella documentazione di dlopen viene suggerito, nella
compilazione
del programma, l'uso dell'opzione "-rdynamic". Ho notato che tutto
funziona anche
non specificando quest'opzione: a cosa serve dunque?
Un grazie a tutti quelli che sono arrivati a leggere fin qui, sperando
che 
qualcuno che abbia più esperienza di me nel settore possa illuminarmi
sull'argomento.
Piergiorgio Pirro
piergior...@tin.it
ICQ# 60945968

semplice e lineare di programmazione. 
Beh, non e' vero. Di solito si fanno cosi' i plugin, molto comodo.
-- 
 (o-  | Un OS per domarli, Un OS per trovarli,
 //\  | Un OS per ghermirli e nel buio incatenarli
 V_/_ | 
http://pinguin.linuxave.net
            r punto salmaso at inwind punto it

non specificando quest'opzione: a cosa serve dunque?
Non credo che sia usata in linux.
-- 
ciao, | * The Internet is full. Go away.  -- Joel Furr *
Marco | (Ri)scoprire fidonet: 
http://bbs.mi.linux.it

 Non credo che sia usata in linux.
Mi pare sia invece indispensabile compilare con quell'opzione se il codice
della libreria dinamica deve usare simboli definiti nel programma
eseguibile.
Max

ed...@maxim.comm2000.it
 wrote:

Giusto, ecco a cosa serve. :-)
Questo pero` credo che succeda solo per i plugin.


contenuto di ld.so.conf? 
Si, basta utilizzare la variabile d'ambiente LD_LIBRARY_PATH; la fai puntare
al percorso delle tue librerie ( ne piu' ne meno che come PATH ) e lanci il
programma. Risolvi tutti e tre i punti; ed anche i tuoi punti successivi.