Dynamic loading
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í uTransakč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
( |
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
}
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
- General Links
- C/C++ UNIX API:
- C/C++ Windows API:
- Java API: