deoarece DLL-urile sunt în esență aceleași cu exe-urile, a căror alegere pentru a produce ca parte a procesului de legare este pentru claritate, deoarece este posibil să exportați funcții și date din oricare.

nu este posibil să executați direct un DLL, deoarece necesită un EXE pentru ca sistemul de Operare să îl încarce printr-un punct de intrare, de unde și existența unor utilități precum RUNDLL.EXE sau RUNDLL32.EXE care oferă punctul de intrare și Cadrul minim pentru DLL-uri care conțin suficientă funcționalitate pentru a executa fără prea mult sprijin.,

DLL-urile oferă un mecanism pentru cod și date partajate, permițând unui dezvoltator de cod/date partajate să actualizeze funcționalitatea fără a necesita re-conectarea sau compilarea aplicațiilor. Din punct de vedere al dezvoltării aplicațiilor, Windows și OS/2 pot fi gândite ca o colecție de DLL-uri care sunt actualizate, permițând aplicațiilor pentru o versiune a sistemului de Operare să funcționeze într-una ulterioară, cu condiția ca furnizorul de sisteme de Operare să se asigure că interfețele și funcționalitatea sunt compatibile.,

DLLs executa în spațiul de memorie a procesului de asteptare și cu aceleași drepturi de acces, ceea ce înseamnă nu există pic de regie în utilizarea lor, dar, de asemenea, că nu există nici o protecție pentru chemarea EXE dacă DLL are nici un fel de bug.

Managementul Memorieiedit

în Windows API, fișierele DLL sunt organizate în secțiuni. Fiecare secțiune are propriul set de atribute, cum ar fi scrierea sau numai în citire, executabil (pentru cod) sau neexecutabil (pentru date) și așa mai departe.,

codul dintr-un DLL este de obicei împărțit între toate procesele care utilizează DLL; adică ocupă un singur loc în memoria fizică și nu ocupă spațiu în fișierul paginii. Windows nu utilizează cod independent de poziție pentru DLL-urile sale; în schimb, codul este supus relocării pe măsură ce este încărcat, fixând adrese pentru toate punctele sale de intrare în locații care sunt libere în spațiul de memorie al primului proces pentru a încărca DLL-ul., În versiunile mai vechi de Windows, în care toate procesele rulante ocupau un singur spațiu comun de adrese, o singură copie a codului DLL ar fi întotdeauna suficientă pentru toate procesele. Cu toate acestea, în versiunile mai noi de Windows care utilizează spații de adrese separate pentru fiecare program, este posibilă utilizarea aceleiași copii relocate a DLL-ului în mai multe programe numai dacă fiecare program are aceleași adrese virtuale gratuite pentru a găzdui codul DLL-ului., Dacă unele programe (sau combinația lor de DLL-uri deja încărcate) nu au aceste adrese gratuite, atunci va trebui creată o copie fizică suplimentară a codului DLL, folosind un set diferit de puncte de intrare mutate. Dacă memoria fizică ocupată de o secțiune de cod trebuie recuperată, conținutul acesteia este aruncat și ulterior reîncărcat direct din fișierul DLL, după cum este necesar. spre deosebire de secțiunile de cod, secțiunile de date ale unui DLL sunt de obicei private; adică fiecare proces care utilizează DLL are propria copie a tuturor datelor DLL., Opțional, secțiunile de date pot fi partajate, permițând comunicarea inter-proces prin această zonă de memorie partajată. Cu toate acestea, deoarece restricțiile utilizatorilor nu se aplică utilizării memoriei DLL partajate, aceasta creează o gaură de securitate; și anume, un proces poate corupe datele partajate, ceea ce va determina probabil ca toate celelalte procese de partajare să se comporte nedorit. De exemplu, un proces care rulează sub un cont de oaspeți poate corupe în acest fel un alt proces care rulează sub un cont privilegiat. Acesta este un motiv important pentru a evita utilizarea secțiunilor partajate în DLL-uri.,

dacă un DLL este comprimat de anumite pachete executabile (de exemplu, UPX), toate secțiunile sale de cod sunt marcate ca citire și scriere și vor fi împărțite. Secțiunile de cod de citire și scriere, la fel ca secțiunile de date private, sunt private pentru fiecare proces. Astfel, DLL-urile cu secțiuni de date partajate nu trebuie comprimate dacă sunt destinate a fi utilizate simultan de mai multe programe, deoarece fiecare instanță de program ar trebui să poarte propria copie a DLL-ului, rezultând un consum crescut de memorie.la fel ca bibliotecile statice, bibliotecile de import pentru DLL-uri sunt notate de .,extensie de fișier lib. De exemplu, kernel32.dll, biblioteca dinamică principală pentru funcțiile de bază Windows, cum ar fi crearea fișierelor și gestionarea memoriei, este legată prin kernel32.lib. Modul obișnuit de a spune o bibliotecă de import dintr-o bibliotecă statică adecvată este în funcție de dimensiune: biblioteca de import este mult mai mică, deoarece conține doar simboluri care se referă la DLL-ul real, care urmează să fie procesate la link-time. Ambele sunt totuși fișiere în format Unix ar.

conectarea la bibliotecile dinamice este de obicei gestionată prin conectarea la o bibliotecă de import atunci când construiți sau conectați pentru a crea un fișier executabil., Executabilul creat conține apoi o tabelă de adrese de import (IAT) prin care sunt menționate toate apelurile funcției DLL (fiecare funcție DLL de referință conține propria intrare în IAT). În timpul rulării, IAT este completat cu adrese corespunzătoare care indică direct o funcție în DLL încărcat separat.

În Cygwin/MSYS și MinGW, import biblioteci sunt în mod convențional sufixul .dll.a, combinând atât Windows DLL sufix și Unix ar sufix., Formatul fișierului este similar, dar simbolurile utilizate pentru a marca importurile sunt diferite (_head_foo_dll vs _ _ IMPORT _ DESCRIPTOR _ foo). Deși sale GNU Binutils toolchain poate genera biblioteci de import și link-ul de la ei, este mai rapid pentru a lega la DLL direct. Un instrument experimental în MinGW numit genlib poate fi folosit pentru a genera lib-uri de import cu simboluri în stil MSVC.

rezoluție simbol și bindingEdit

fiecare funcție exportată de un DLL este identificată printr-un ordinal numeric și opțional un nume. De asemenea, funcțiile pot fi importate dintr-un DLL fie prin ordinal, fie prin nume., Ordinalul reprezintă poziția indicatorului de adresă al funcției în tabelul de adrese de Export DLL. Este obișnuit ca funcțiile interne să fie exportate numai prin ordinal. Pentru majoritatea funcțiilor API Windows, numai numele sunt păstrate în diferite versiuni Windows; ordinalele pot fi modificate. Astfel, nu se poate importa în mod fiabil funcțiile Windows API de către ordinalii lor.

importul funcțiilor prin ordinal oferă doar o performanță puțin mai bună decât importul lor după nume: tabelele de export ale DLL-urilor sunt ordonate după nume, astfel încât o căutare binară poate fi utilizată pentru a găsi o funcție., Indexul numelui găsit este apoi folosit pentru a căuta ordinalul în tabelul Ordinal de Export. În Windows pe 16 biți, tabelul de nume nu a fost sortat, astfel încât numele de căutare deasupra capului a fost mult mai vizibil.de asemenea, este posibil să legați un executabil la o versiune specifică a unui DLL, adică să rezolvați adresele funcțiilor importate la momentul compilării. Pentru importurile legate, linker salvează marca de timp și suma de control a DLL la care importul este legat. La run-time Windows verifică dacă se utilizează aceeași versiune a bibliotecii și, dacă da, Windows ocolește procesarea importurilor., În caz contrar, dacă biblioteca este diferită de cea care a fost legată, Windows procesează importurile într-un mod normal.executabilele Bound se încarcă ceva mai repede dacă sunt rulate în același mediu pentru care au fost compilate și exact în același timp dacă sunt rulate într-un mediu diferit, deci nu există niciun dezavantaj pentru legarea importurilor. De exemplu, toate aplicațiile Windows standard sunt legate de DLL-urile de sistem ale lansării lor Windows respective. O bună oportunitate de a lega importurile unei aplicații de mediul țintă este în timpul instalării aplicației., Aceasta menține bibliotecile „legate” până la următoarea actualizare a sistemului de operare. Cu toate acestea, modifică suma de control a executabilului, deci nu este ceva ce se poate face cu programe semnate sau programe care sunt gestionate de un instrument de gestionare a configurației care utilizează sume de control (cum ar fi sumele de control MD5) pentru a gestiona versiunile de fișiere. Deoarece versiunile mai recente de Windows s-au îndepărtat de a avea adrese fixe pentru fiecare bibliotecă încărcată (din motive de securitate), oportunitatea și valoarea legării unui executabil scad.,

Explicite run-time linkingEdit

fișiere DLL poate fi încărcat în mod explicit la run-time, un proces menționată pur și simplu ca run-time dynamic linking de Microsoft, cu ajutorul LoadLibrary (sau LoadLibraryEx) funcția API. Funcția API GetProcAddresseste utilizată pentru a căuta simbolurile exportate după nume și FreeLibrary – pentru a descărca DLL-ul. Aceste funcții sunt similare cu dlopen, dlsym și dlclose în standardul POSIX API.,procedura pentru legarea explicită a timpului de rulare este aceeași în orice limbă care acceptă indicii pentru funcții, deoarece depinde mai degrabă de API-ul Windows decât de construcțiile de limbă.în mod normal, o aplicație care este legată de biblioteca de import a DLL – ului nu va porni dacă DLL-ul nu poate fi găsit, deoarece Windows nu va rula aplicația decât dacă poate găsi toate DLL-urile de care aplicația poate avea nevoie. Cu toate acestea, o aplicație poate fi legată de o bibliotecă de import pentru a permite încărcarea întârziată a Bibliotecii dinamice.,În acest caz, sistemul de operare nu va încerca să găsească sau încărca DLL, atunci când aplicația pornește; în schimb, un stub este inclus în cererea de linker-ul care va încerca să găsească și încărca DLL prin LoadLibrary si GetProcAddress când una dintre funcțiile sale este numit. Dacă DLL-ul nu poate fi găsit sau încărcat sau funcția apelată nu există, aplicația va genera o excepție, care poate fi prinsă și tratată corespunzător. Dacă aplicația nu se ocupă de excepție, aceasta va fi prinsă de sistemul de operare, care va termina programul cu un mesaj de eroare.,mecanismul de întârziere de încărcare oferă, de asemenea, cârlige de notificare, permițând aplicației să efectueze procesarea suplimentară sau manipularea erorilor atunci când DLL este încărcat și/sau orice funcție DLL este numit.