Biblioteca compartida

Una biblioteca compartida o objecte compartit és un fitxer que està pensat per ser compartit per fitxers executables i altres fitxers d'objectes compartits. Els mòduls utilitzats per un programa es carreguen des d'objectes compartits individuals a la memòria en temps de càrrega o en temps d'execució, en lloc de ser copiats per un enllaçador quan crea un únic fitxer executable monolític per al programa.[1]

Les biblioteques compartides es poden enllaçar estàticament durant el temps de compilació, el que significa que les referències als mòduls de la biblioteca es resolen i els mòduls s'assignen memòria quan es crea el fitxer executable. Però sovint l'enllaç de biblioteques compartides es posposa fins que es carreguen.[2]

La majoria dels sistemes operatius moderns poden tenir fitxers de biblioteques compartides del mateix format que els fitxers executables. Això ofereix dos avantatges principals: en primer lloc, requereix fer només un carregador per a tots dos, en lloc de dos (que tenir un sol carregador es considera que val la pena la seva complexitat afegida). En segon lloc, permet utilitzar els executables també com a biblioteques compartides, si tenen una taula de símbols. Els formats típics combinats d'executable i de biblioteca compartida són ELF i Mach-O (tots dos en Unix) i PE (Windows).

En alguns entorns antics, com ara Windows de 16 bits o MPE per a l'HP 3000, només es permetien les dades basades en la pila (locals) al codi de biblioteca compartida o es van posar altres restriccions significatives al codi de biblioteca compartida.[3]

Compartició de memòria

[modifica]

El codi de la biblioteca es pot compartir a la memòria mitjançant diversos processos i al disc. Si s'utilitza memòria virtual, els processos executarien la mateixa pàgina física de RAM que s'assigna als diferents espais d'adreces dels processos. Això té avantatges. Per exemple, al sistema OpenStep, les aplicacions sovint només tenien una mida d'uns pocs centenars de kilobytes i es carregaven ràpidament; la major part del seu codi es trobava en biblioteques que el sistema operatiu ja havia carregat per a altres finalitats.

Enllaç dinàmic

[modifica]

L'enllaç dinàmic o l'enllaç tardà es realitza mentre es carrega un programa (temps de càrrega) o s'executa (temps d'execució), més que quan es crea el fitxer executable. Una biblioteca enllaçada dinàmicament (dynamic-link library, o DLL, sota Windows i OS/2; imatge compartible sota OpenVMS; [4] dynamic shared object, o DSO, sota sistemes semblants a Unix) és una biblioteca destinada a l'enllaç dinàmic. L'enllaçador només fa una quantitat mínima de treball quan es crea el fitxer executable; només registra quines rutines de biblioteca necessita el programa i els noms o números d'índex de les rutines de la biblioteca. La major part del treball d'enllaç es fa en el moment en què es carrega l'aplicació (temps de càrrega) o durant l'execució (temps d'execució). Normalment, el programa d'enllaç necessari, anomenat "enllaçador dinàmic" o "carregador d'enllaços", en realitat forma part del sistema operatiu subjacent. (No obstant això, és possible, i no massa difícil, escriure un programa que utilitzi l'enllaç dinàmic i inclogui el seu propi enllaç dinàmic, fins i tot per a un sistema operatiu que no ofereix suport per a l'enllaç dinàmic.)

Localització de biblioteques en temps d'execució

[modifica]

Els carregadors per a biblioteques compartides varien molt en funció de la seva funcionalitat. Alguns depenen de l'executable que emmagatzema camins explícits a les biblioteques. Qualsevol canvi en el nom de la biblioteca o la disposició del sistema de fitxers farà que aquests sistemes fallin. Més comunament, només el nom de la biblioteca (i no el camí) s'emmagatzema a l'executable, amb el sistema operatiu que proporciona un mètode per trobar la biblioteca al disc, basat en algun algorisme.

Càrrega dinàmica

[modifica]

La càrrega dinàmica, un subconjunt d'enllaços dinàmics, implica la càrrega i descàrrega d'una biblioteca enllaçada dinàmicament en temps d'execució a petició. Aquesta sol·licitud es pot fer de manera implícita o explícita. Les sol·licituds implícites es fan quan un compilador o enllaçador estàtic afegeix referències de biblioteques que inclouen camins de fitxers o simplement noms de fitxers. Les sol·licituds explícites es fan quan les aplicacions fan trucades directes a l'API d'un sistema operatiu.

La majoria dels sistemes operatius que admeten biblioteques enllaçades dinàmicament també admeten la càrrega dinàmica d'aquestes biblioteques mitjançant una API d'enllaç en temps d'execució. Per exemple, Microsoft Windows utilitza les funcions de l'API LoadLibrary, LoadLibraryEx, FreeLibrary i GetProcAddress amb les biblioteques d'enllaços dinàmics de Microsoft; Els sistemes basats en POSIX, inclosos la majoria de sistemes UNIX i similars a UNIX, utilitzen dlopen, dlclose i dlsym. Alguns sistemes de desenvolupament automatitzen aquest procés.

Referències

[modifica]
  1. «Shared Libraries» (en anglès). [Consulta: 9 desembre 2023].
  2. Kili, Aaron. «Understanding Shared Libraries in Linux» (en anglès americà), 30-10-2017. [Consulta: 9 desembre 2023].
  3. «Difference between static and shared libraries?» (en anglès). [Consulta: 9 desembre 2023].
  4. «VSI OpenVMS Linker Utility Manual» (en anglès). VSI, 01-08-2019. [Consulta: 31 gener 2021].