Biblioteca d'enllaços dinàmics

De la Viquipèdia, l'enciclopèdia lliure.
Saltar a la navegació Saltar a la cerca
Nota de desambiguació.svg Desambiguació : aquí es refereix "DLL". Si esteu buscant altres significats, vegeu DLL (desambiguació) .

Una biblioteca d’enllaços dinàmics (de l’ anglès , traduït a l’ italià amb biblioteca d’enllaços dinàmics ), en informàtica , indica una biblioteca de programari que es carrega dinàmicament en temps d’execució, en lloc d’estar enllaçada estàticament amb un executable en el moment de la compilació . Aquestes biblioteques es coneixen amb l'acrònim DLL , que és l' extensió del fitxer que tenen al sistema operatiu Microsoft Windows , o també amb el terme biblioteques compartides (de biblioteca compartida , utilitzat a la literatura de sistemes Unix ). En sistemes que utilitzen ELF com a format de fitxer executable , com Solaris o Linux , també es coneixen com a ".so", abreviatura de Shared Object .

Avantatges i inconvenients

La separació del codi en biblioteques d’enllaços dinàmics us permet dividir el codi executable en parts conceptualment separades, que només es carregaran si realment es necessiten. A més, una sola biblioteca, carregada a la memòria, pot ser utilitzada per diversos programes, sense necessitat de tornar a carregar-la, cosa que estalvia recursos del sistema. Aquest mètode de càrrega a la carta també permet instal·lar parcialment un sistema de programari, en el qual només les biblioteques associades a les funcions que l'usuari vol utilitzar estan realment presents a la memòria massiva, tal com es selecciona durant la fase d'instal·lació.

Un altre avantatge és la possibilitat d’actualitzar un programa modificant només les DLL: mitjançant la inserció d’una versió diferent de la DLL, que conté solucions d’errors , per exemple, tots els programes que l’utilitzen s’actualitzaran automàticament sense necessitat de tornar a compilar-los.

El principal desavantatge està relacionat amb el fet que una nova versió d’una DLL podria fer els anomenats canvis de ruptura voluntària o, sense saber-ho, a causa d’errors de la nova versió. Un canvi de ruptura és un canvi crític en el comportament del codi de funció que fa que ja no sigui compatible amb les convencions en ús (per exemple, una funció que anteriorment retornava NULL en cas d’error als paràmetres i que ara defineix errno i retorna un valor no nul). Encara més crític és el cas en què un instal·lador sobreescriu una DLL amb una versió anterior. Es poden produir altres problemes a l’entorn COM . Aquests problemes, ben coneguts pels programadors de Windows , s'agrupen amb el nom de Hell DLL (DLL Hell).

En alguns sistemes operatius, típicament Unix i Unix , és possible fer coexistir diferents versions incompatibles de la mateixa biblioteca, sempre que estiguin presents individualment al sistema de fitxers en diferents camins i sigui possible, quan es connecti el programa, 'identificació de la versió correcta de la biblioteca a utilitzar. D'aquesta manera, els programes enllaçats abans de la instal·lació de la nova biblioteca poden continuar utilitzant la versió anterior. [1]

Els sistemes operatius de tipus Windows guarden una còpia de seguretat de les DLL del sistema en una memòria cau especial, a la carpeta oculta C:\windows\system32\dllcache . Les biblioteques en ús s’emmagatzemen a la C:\windows\system32\dll .

DLL a Microsoft Windows

Estructura i funció

A continuació es descriu l'estructura i el funcionament d'una biblioteca d'enllaços dinàmics en un entorn Windows, però els conceptes expressats són generalment equivalents en tots els sistemes que permeten l'ús de biblioteques dinàmiques.

Una biblioteca d’enllaços dinàmics és efectivament un codi executable. Cada fitxer executable (EXE o DLL) té un punt d’ entrada (punt d’entrada) invocat pel sistema operatiu immediatament després de la càrrega. Per a una DLL, el punt d'entrada està assignat convencionalment a la funció DllMain (a criteri del compilador ).

La funció DllMain , a més de carregar la DLL, també s’invoca en descarregar o quan es crea o es destrueix un fil en el procés on resideix la DLL.

A diferència d’un fitxer EXE, la DLL ha de sortir del punt d’entrada tan bon punt hagi acabat les inicialitzacions necessàries.

Estructura

Per simplificar, una biblioteca es pot considerar com una col·lecció de funcions. Cadascuna d’aquestes funcions tindrà la seva pròpia adreça base, calculada com a compensació respecte a l’ adreça base assignada pel sistema operatiu en carregar la biblioteca (vegeu el paràgraf següent). El que distingeix una biblioteca dinàmica és que aquestes funcions es poden exportar , és a dir, que els seus noms es col·loquen en una llista d’una secció de l’executable. Per tant, és possible determinar el punt d'entrada d'una funció amb una cerca de text basada en el nom de la funció. Aquesta operació la realitza l' API GetProcAddress que retorna l'adreça de la funció el nom del qual es passa com a paràmetre.

S'està carregant

El sistema operatiu carrega les biblioteques dinàmiques a l’ espai de memòria del procés que les ha sol·licitat. D’aquesta manera, accedir al codi DLL tindrà un rendiment gairebé equivalent al del propi codi d’aplicació o al codi de les biblioteques estàtiques (veurem per què són quasi equivalents més endavant).

Per evitar que el codi de l'aplicació i el codi DLL ocupin la mateixa ubicació de memòria, l' enllaçador haurà de preparar la DLL per a la reubicació . A la pràctica, el sistema operatiu determina una àrea de memòria disponible i torna a mapar qualsevol referència de memòria continguda al codi DLL. Com que això requereix temps, cada DLL té la seva pròpia adreça base ideal : la reubicació només serà necessària si ja s'ha assignat una DLL anterior a aquesta adreça predeterminada. Per especificar l'adreça ideal, podeu utilitzar una regla general, basada en la lletra inicial del nom de la DLL, segons la taula següent:

Carta inicial Adreça base
B.C 0x60000000
DF 0x61000000
GI 0x62000000
JL 0x63000000
MO 0x64000000
PR 0x65000000
ACTIVAT 0x66000000
VX 0x67000000
YZ 0x68000000

Enllaç a un executable

La connexió d’un executable a una biblioteca dinàmica té lloc durant l’execució (en temps d’execució ) i es realitza mitjançant l’API LoadLibrary , que accepta el nom de la biblioteca com a entrada . Per exemple, LoadLibrary(_T("MyLib.dll")) carregarà la DLL MyLib.dll l'espai de memòria de l'aplicació.

L’enllaç pot ser de dos tipus: explícit o implícit.

Enllaç explícit

La connexió explícita es gestiona directament mitjançant el codi del programa amb l'ús de les dues API LoadLibrary i GetProcAddress descrites anteriorment. Si utilitzeu el llenguatge C , assignareu un punter a la funció especificada en què, quan utilitzeu la funció sol·licitada, carregareu l'adreça amb GetProcAddress . Aquesta tècnica permet gestionar correctament l’estat en què no hi ha una DLL necessària al sistema, però en general és més pesada perquè requereix l’ús explícit de les dues API. Aquesta tècnica és essencial quan s’utilitzen alguns llenguatges de programació, com ara Visual Basic, per exemple.

Enllaç implícit

L'enllaç implícit és gestionat directament per l'enllaçador en el moment de la compilació i s'utilitza quan se suposa que una DLL sempre està present al sistema. Sempre que es crida una funció continguda en una DLL al codi font, l’enllaçador enllaçarà la trucada de funció a una funció stub , és a dir, a una funció fictícia. Dins de l'executable hi haurà una taula que conté els esbossos de totes les funcions DLL necessàries. En carregar l’executable, el sistema operatiu carregarà automàticament totes les DLL necessàries i maparà cada memòria al punt d’entrada de la funció relativa a la DLL relativa. Si no es troba una DLL necessària (o fins i tot una funció única en una DLL), el sistema operatiu impedirà que el programa comenci amb un missatge d'error.

L’ús d’enllaços implícits té un desavantatge pel que fa al rendiment, ja que cada vegada que es crida una funció continguda en una DLL hi ha un doble salt a la funció: primer a la línia inicial i després a l’adreça de la funció; el sobrecost generat és realment insignificant.

S'ha retardat l'enllaç implícit

Una variant d'enllaços implícits esperada per alguns compiladors és l' enllaç retardat . En aquest cas, s’utilitza un taló especial que el sistema operatiu no assigna a la càrrega. En canvi, aquest capçal , la primera vegada que s’invoca, es maparà automàticament (amb la tècnica d’enllaç explícit) a la funció DLL. Aquesta tècnica té l'avantatge de no requerir la presència de la DLL per carregar l'executable, juntament amb la comoditat de no haver de carregar explícitament la biblioteca des del codi

Nota

Articles relacionats

Enllaços externs

Informàtica Portal de TI : accediu a les entrades de Viquipèdia relacionades amb TI