Dynamic-link library: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
sembra che il problema sia già stato risolto, la voce parla di DLL di Windows, non di librerie in generale (a parte il link che ho tolto) Etichetta: Rimozione di avvisi di servizio |
fix |
||
Riga 39:
== Struttura ==
Per semplificare, una libreria può 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]] <code>GetProcAddress</code> 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 (informatica)|prestazioni]] quasi equivalenti a quelle del codice dell'applicazione stessa o del codice delle librerie statiche (in seguito si vedrà perché quasi equivalenti).
Line 71 ⟶ 69:
== Collegamento ==
Il collegamento di un eseguibile a una libreria dinamica avviene durante l'esecuzione (a ''run time'') e avviene tramite l'API <code>LoadLibrary</code>, che accetta in [[input]] il nome della libreria. Ad esempio, <code>LoadLibrary(_T("MyLib.dll"))</code> caricherà all'interno dello spazio di memoria dell'applicazione la DLL <code>MyLib.dll</code>.
Line 77 ⟶ 74:
=== Collegamento esplicito ===
Il collegamento esplicito viene gestito direttamente dal codice del programma con l'utilizzo delle due API <code>LoadLibrary</code> e <code>GetProcAddress</code> precedentemente descritte. Se si utilizza il [[linguaggio C]] si allocherà un [[puntatore (programmazione)|puntatore]] alla funzione specificata nel quale, al momento di utilizzare la funzione richiesta, si caricherà l'indirizzo con <code>GetProcAddress</code>. Questa tecnica permette di gestire in modo appropriato la condizione nella quale una DLL richiesta non è presente nel sistema, ma in generale è più macchinosa perché richiede l'utilizzo ''esplicito'' delle due API. Questa tecnica è indispensabile usando alcuni linguaggi di programmazione, quali ad esempio [[Visual Basic]].
=== Collegamento implicito ===
Il collegamento implicito è gestito direttamente dal linker in fase di compilazione, ed è usato quando si assume che una DLL sia sempre presente nel sistema. Ogni volta che nel codice sorgente è richiamata una funzione contenuta in una DLL, il linker collegherà la chiamata a funzione ad una funzione ''stub'', ovvero ad una funzione fittizia. All'interno dell'eseguibile vi sarà una tabella contenente gli ''stub'' a tutte le funzioni di DLL richieste. In fase di caricamento dell'eseguibile, il sistema operativo caricherà in automatico tutte le DLL richieste e mapperà ogni ''stub'' al punto di ingresso della relativa funzione nella relativa DLL. Se una DLL (o anche una singola funzione in una DLL) richiesta non viene trovata il sistema operativo bloccherà l'avvio del programma con un messaggio di errore.
Line 87 ⟶ 82:
=== Collegamento implicito ritardato ===
Una variante al collegamento implicito prevista da alcuni compilatori è il ''collegamento ritardato''. In questo caso viene utilizzato uno ''stub'' speciale, che non viene mappato al caricamento dal sistema operativo. Questo ''stub'' invece, la prima volta che verrà invocato, si mapperà automaticamente (con la tecnica del collegamento esplicito) alla funzione della DLL. Questa tecnica ha il vantaggio di non richiedere la presenza della DLL per il caricamento dell'eseguibile, insieme alla comodità di non dover caricare esplicitamente da codice la libreria
|