[Linuxtrent] Re: Nautilus

  • From: Roberto Cavada <cavada@xxxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Mon, 27 Sep 2004 10:34:45 +0200

Mi dilungo probabilmente un po' approssimativamente e su argomenti forse
gia' noti. I programmi (come nautilus) utilizzano spesso delle
funzionalita' condivise da altri programmi. Un modo per mettere a
disposizione delle funzionalita' condivisibili sono le librerie
dinamiche. In sostanza il programma contiene dei riferimenti alle
funzionalita', e al momento del caricamento in memoria del programma, il
sistema operativo carica anche le librerie da cui il programma dipende,
e fa il linking dinamico delle funzionalita' che servono. 

Questo tipo di dipendenza e' applicabile anche alle librerie; puoi
quindi avere delle funzionalita' in una libreria che dipendono da altre
funzionalita' in altre librerie. 

Ad esempio:
1) nautilus viene lanciato
2) durante il caricamento linux cerca di risolvere una quantita' di
simboli di cui nautilus necessita, tra cui 'gdk_threads_lock'. Secondo
nautilus tale simbolo si trova nella libreria /usr/lib/libnautilus-
private.so 
3) Le librerie dinamiche vengono cercate nei path di default e in quelli
elencati nella variabile d'ambiente LD_LIBRARY_PATH. 
4) Viene trovata /usr/lib/libnautilus-private.so, ma 'gdk_threads_lock'
non e' definito neanche qui. Secondo libnautilus-private.so tale
funzione e' in '/usr/lib/libgdk-x11-2.0.so'
5) Viene caricato /usr/lib/libgdk-x11-2.0.so e viene fato il linking del
simbolo. 
6) Si procede per tutti gli altri simboli non definiti
7) Si lancia main dentro nautilus

Due parole sui nomi delle librerie dinamiche. 
Una libreria "libpippo.so" normalmentre ha un numero di versione,
diciamo 2.0.1. Allora il file che ospita la libreria si chiamera' 
"libpippo.so.2.0.1". Di solito esistono dei link simbolici che puntano a
tale file, come ad esempio "libpippo.so.2" e "libpippo.so". Lo scopo dei
link e' di astrarre via la versione per aumentare la genericita'. Ad
esempio un programma che dipenda dalla versione 2 di libpippo.so, potra'
essere dinamicamente dipendente da "libpippo.so.2", ed essere quindi
indipendente dalla specifica sotto-versione che il sistema fornisce. 

Nel tuo caso:
* libnautilus-private.so si chiama "libnautilus-private.so.2.0.0".
Esiste un link simbolico alla versione 2 chiamato 
"/usr/lib/libnautilus-private.so.2"
* libgdk-x11-2.0.so si chiama "/usr/lib/libgdk-x11-2.0.so.0.200.4".
Esiste un link chiamato "libgdk-x11-2.0.so.0"

Ora due note sui comandi che hai usato:
* ldd elenca le dipendenze da librerie di programmi e librerie (non
procede ricorsivamente). 
* nm elenca i simboli presenti in un file oggetto, come un libreria. 
Ad esempio se <libreria> fornisce la funzione 'gdk_threads_lock', questo
simbolo deve comparire nell'elenco restituito da "nm <libreria>" (piu'
complesso di cosi', vedi il manuale per i dettagli). 

Dal tuo report, sembrerebbe che "/usr/lib/libnautilus-private.so.2"
dipenda da "/usr/lib/libgdk-x11-2.0.so.0" e che quest'ultima libreria
non contenga "gdk_threads_lock". Se e' cosi', le gdk sono state
compilate senza il supporto per il threading. 

$> nm /usr/lib/libgdk-x11-2.0.so.0 | grep gdk_threads_lock

cosa restituisce?
rob


-- 
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: