Přeskočit na obsah

Dynamic loading

Z Wikipedie, otevřené encyklopedie

Dynamic loading (dynamické načítání) je v informatice označení pro mechanismus, který načte knihovnu do paměťového prostoru za běhu procesu. Běžící proces tak získá možnost volat procedury a funkce, které jsou v načtené knihovně. Knihovnu lze později z paměti uvolnit. Mechanismus umožňuje programátorovi v případě nedostupnosti knihovny provést náhradní činnost (použít alternativní knihovnu, zobrazit hlášení uživateli a podobně).

Historie

Dynamické načítání bylo běžným mechanismem pro IBM/360 Operační systémy (začátek 60.let až období (ještě existující) Z/Architektury) a to zejména pro I/O podrutiny, COBOL a PL/1 runtime knihovny. Co se týče programátora aplikací, nahrávání je do značné míry transparentní, protoze je většinou ovládáno samotným operačním systémem.

IBM využívá dynamické načtení u Transakčního zpracování CICS a to jak pro jádro operačního systému, tak i pro normální aplikační program. Opravy těchto programů mouhou být uskutečněny offline a nové kopie nebo změny v programu načteny dynamicky bez nutnosti restartovat CICS.

Mezi hlavní výhody patří:

  • Opravy podsystému jsou uskutečneny v celém programu najednou, bez nutnosti znovunačtení
  • Knihovny mohou být chráněny před nežádanou úpravou

Použití

Dynamické načítání je nejčastěji používáno v implementaci softwarových pluginů (modulární struktura Apache HTTP Serveru). Nebo v programech, které nabízejí více podporovaných knihoven a uživatel si je jednotlivě může volit (rozšiřující knihovny pro PHP).

C/C++

Dynamické načítání nepodporují všechny systémy. Mac OS X, Linux a Solaris nabízí dynamické načítání prostřednictvím programovacího jazyka C - knihovní „dl“ funkce. Operační systém Windows podporuje dynamické načítání pomocí volání Windows API.

Shrnutí

Název Standard POSIX/UNIX API Microsoft Windows API
Zařazení hlavičkového souboru #include <dlfcn.h> #include <windows.h>
Definice hlavičky dl

(libdl.so, libdl.dylib, závisí na operačním systému)

Kernel32.dll
Načtení knihovny dlopen LoadLibrary
LoadLibraryEx
Extrahování obsahu dlsym GetProcAddress
Zavření knihovny dlclose FreeLibrary

Načtení knihovny

Načtení knihovny se provede prostřednictvím LoadLibrary nebo LoadLibraryEx na operačním systému Windows a pomocí dlopen na operačních systémech na bázi Linuxu. Následují příklady:

Linux, *BSD, Solaris, etc.

void* sdl_library = dlopen("libSDL.so", RTLD_LAZY);
if(sdl_library == NULL) {
   // oznámení chyby ...
} else {
   // výsledek zavoláním dlsym
}

Mac OS X

UNIX library:

void* sdl_library = dlopen("libsdl.dylib", RTLD_LAZY);
if(sdl_library == NULL) {
   // oznámení chyby ...
} else {
   //  výsledek zavoláním dlsym
}

OS X Framework:

void* sdl_library = dlopen("/Library/Frameworks/SDL.framework/SDL", RTLD_LAZY);
if(sdl_library == NULL) {
   // oznámení chyby ...
} else {
   // výsledek zavoláním dlsym
}

Windows

HMODULE sdl_library = LoadLibrary("SDL.dll");
if( sdl_library == NULL) {
   //oznámení chyby ...
} else {
   // výsledek zavoláním GetProcAddress
}

Extrahování obsahu knihovny

Extrahování obsahu dynamicky namáhané knihovny je dosaženo pomocí příkazu GetProcAddress ve Windows a dlsym v Unix systému.

Linux, *BSD, Mac OS X, Solaris, etc.

void* initializer = dlsym(sdl_library,"SDL_Init");
if(initializer == NULL) {
   // oznámení chyby ...
} else {
   ...
}

Windows

FARPROC initializer = GetProcAddress(sdl_library,"SDL_Init");
if(initializer == NULL) {
   // report error ...
} else {
   ...
}

Převod extrahovaného obsahu knihovny

Vrácený výsledek prostřednictvím dlsym() nebo GetProcAddress() musí být převeden do požadované destinace předtím, než může být použit.

Windows

V případě systému Windows, konverze je jednoduchá, protože FARPROC je v podstatě již ukazatel funkce:

typedef INT_PTR (*FARPROC)(void);

Může nastat problém, pokud adresy objektu jsou vyvolány místo funkce. Nicméně, obvykle jeden chce získat funkce stejně, takže to není ve výsledku problém.

typedef void (*sdl_init_function_type)(void);
sdl_init_function_type init_func = (sdl_init_function_type) initializer;

Literatura

Související články