Dynamic-link library: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
RibotBOT (discussione | contributi)
m r2.7.1+) (Bot: Modifico: uk:Dynamic-link library
Nessun oggetto della modifica
Riga 1:
{{Nota disambigua|altre voci che possono riferirsi alla stessa combinazione di 3 caratteri|[[DLL (disambigua)]]|redirect=DLL}}
 
In [[informatica]], una '''''dynamic-link library''''' (termine [[lingua inglese|inglese]], tradotto in [[lingua italiana|italiano]] con '''libreria a collegamento dinamico''') è una [[libreria software]] che viene caricata dinamicamente in fase di esecuzione, invece di essere [[Linguaggio di programmazione#Il collegamento (linking)|collegata]] staticamente ada un eseguibile in fase di [[compilatore|compilazione]]. Queste librerie sono note con l'acronimo '''DLL''', che è l'[[estensione (file)|estensione]] del [[file]] che hanno nel [[sistema operativo]] [[Microsoft Windows]], o anche con il termine '''librerie condivise''' (da ''shared library'', usato nella letteratura dei sistemi [[Unix]]). Nei sistemi che usano [[Executable and linkable format|ELF]] come formato dei [[File eseguibile|file eseguibili]], come ad esempio [[Solaris (sistema operativo)|Solaris]] o [[Linux]], sono anche note come ".so", abbreviazione di ''Shared Object''.
 
== Vantaggi e svantaggi ==
La separazione del codice in librerie a collegamento dinamico permette di spezzaresuddividere iil programmicodice eseguibile in parti concettualmente separate, che verranno caricate solo se effettivamente necessarie. Inoltre, una singola libreria può essere, caricata in memoria, unapuò sola volta eessere utilizzata da più programmi, senza la necessità di essere nuovamente caricata, il che permette di risparmiare le risorse del sistema. Questo metodo di ''loading on demand'' consente, inoltre, installazioni parziali di un sistema software, in cui sono effettivamente presenti sulla memoria di massa solo le librerie associate alle funzioni che l'utente desidera utilizzare, come selezionate in fase di installazione.
 
Un altro vantaggio è la possibilità di aggiornare un programma modificando solo le DLL: inserendo una versione diversa della DLL, che contiene ad esempio dei ''[[bug fix]]'', tutti i programmi che la usano saranno automaticamente "aggiornati" senza bisogno di essere ricompilati.
 
Il principale svantaggio è legato al fatto che una nuova versione di una DLL potrebbe effettuare dei cosiddetti ''breaking changes'', in modo volontario o, inconsapevolmente, a causa di bug nella nuova versione. Un breaking change è una modificacambiamento delcritico nel comportamento didel unacodice della funzione che la rende non più compatibile con le convenzioni in uso (ad esempio, una funzione che prima ritornavarestituiva NULL in caso di errore nei parametri e che ora setta ''[[errno]]'' e ritornarestituisce un valore non nullo). Ancora più critico il caso in cui un programma di installazione sovrascriva una DLL con una versione più vecchia. Altri problemi possono verificarsi in ambiente [[Component Object Model#Inferno delle DLL|COM]]. Questi problemi, ben noti ai programmatori [[Windows]], sono raggruppati sotto il nome di ''DLL hell'' (''inferno delle DLL'').
 
In alcuni sistemi operativi, tipicamente [[Unix]] e [[Unix-like]], è possibile far convivere versioni diverse, fra loro incompatibili, di una stessa libreria, purché entrambe siano singolarmente presenti sul [[file system]] in differenti [[Pathname|percorsi]] e sia possibile, in fase di collegamento del programma, l'identificazione della versione corretta di libreria da utilizzare. In questa maniera, i programmi collegati prima dell'installazione della nuova libreria possono continuare ad avvalersi della vecchia versione.<ref>[http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/HTML/AA-PS30D-TET1_html/peg5.html#version_check_at_load Sito HP, Manuale Digital Unix: Controllo versione librerie in fase di caricamento]</ref>
 
I [[sistema operativo|sistemi operativi]] di tipo Windows mantengono un [[Backup|back up]] delle DLL di sistema in un'apposita memoria [[cache]], nella [[cartella]] nascosta system32/dllcache. Nella cartella system32/dll sono invece memorizzate le librerie in uso.
Riga 22:
Una libreria a collegamento dinamico è a tutti gli effetti un codice eseguibile. Ogni [[file eseguibile]] (EXE o DLL) dispone di un [[punto d'ingresso]] (''entry point'') invocato dal sistema operativo subito dopo il caricamento. Per una DLL il punto d'ingresso è mappato per convenzione sulla [[funzione (informatica)|funzione]] <tt>DllMain</tt> (a discrezione, comunque, del [[compilatore]]).
 
La funzione <tt>DllMain</tt> viene invocata, oltre che al caricamento della DLL, viene invocata anche allo scaricamento eo quando un [[thread]] viene creato o distrutto nel [[processo (informatica)|processo]] in cui la DLL risiede.
 
A differenza di un file EXE, la DLL deve uscire dall'entry point non appena ha terminato le inizializzazioni necessarie.
Riga 28:
=== Struttura ===
 
Per semplificare, possiamo pensare ad una libreria come adpuò essere pensata come una raccolta di funzioni. Ognuna di queste funzioni avrà il proprio indirizzo di base, calcolato come [[offset]] rispetto all'[[indirizzo di base]] assegnato dal sistema operativo durante il caricamento della libreria (vedi paragrafo successivo). Ciò che distingue una libreria dinamica è che queste funzioni possono essere ''esportate'', ovvero i loro nomi vengono posti in una lista in una sezione dell'eseguibile. Perciò è possibile determinare il punto di ingresso di una funzione con una ricerca testuale basata sul nome della funzione. Questa operazione è svolta dall'[[Windows API|API]] <tt>GetProcAddress</tt> che restituisce l'indirizzo della funzione il cui nome è passato come parametro.
 
=== Caricamento ===
 
Le librerie dinamiche vengono caricate dal sistema operativo all'interno dello [[spazio di memoria]] del processo che le ha richieste. In questo modo l'accesso al codice della DLL avrà prestazioni quasi equivalenti a quelle del codice dell'applicazione stessa o del codice delle librerie statiche (vedremo in seguito si vedrà perché ''quasi'' equivalenti).
 
Per evitare che il codice dell'applicazione e quello della DLL occupino la stessa posizione in memoria, il [[linker]] dovrà predisporre la DLL per la [[rilocazione]]. In pratica, il sistema operativo determina un'area di memoria disponibile e rimappa ogni riferimento alla memoria contenuto nel codice della DLL. Siccome quest'operazione richiede tempo, ogni DLL dispone di un proprio ''indirizzo di base'' ideale: la rilocazione sarà necessaria solo se a questo indirizzo predeterminato è già stata mappata una precedente DLL. Per specificare l'indirizzo ideale si può usare una regola empirica, basata sulla lettera iniziale del nome della DLL, secondo la seguente tabella:
Riga 60:
=== Collegamento ad un eseguibile ===
 
Il collegamento di un eseguibile ada una libreria dinamica avviene durante l'esecuzione (a ''run time'') ede avviene tramite l'API <tt>LoadLibrary</tt>, che accetta in [[input]] il nome della libreria. Ad esempio, <tt>LoadLibrary(_T("MyLib.dll"))</tt> caricherà all'interno dello spazio di memoria dell'applicazione la DLL <tt>MyLib.dll</tt>.
 
Il collegamento può essere di due tipi: esplicito o implicito.