Provided by:
manpages-pl-dev_20060617-3_all 
NAZWA
dlclose, dlerror, dlopen, dlsym - interfejs programisty dla dynamicznie
konsolidujcego loadera
SK/LADNIA
#include <dlfcn.h>
void *dlopen(const char *filename, int flag);
const char *dlerror(void);
void *dlsym(void *handle, char *symbol);
int dlclose(void *handle);
Symbole specjalne: _init, _fini.
OPIS
dlopen laduje bibliotek dynamiczn z pliku, o nazwie zawartej w
zakoczonym znakiem NUL lacuchu filename i zwraca nieprzezroczysty
"uchwyt" dla tej biblioteki dynamicznej. Jeli filename nie jest ciek
absolutn (np. nie rozpoczyna si od "/"), to plik jest poszukiwany w
nastpujcych miejscach:
Rozdzielonej dwukropkami licie katalogow, zdefiniowanej w
zmiennej rodowiskowej LD_LIBRARY_PATH.
Licie bibliotek podanej w /etc/ld.so.cache.
/lib, a potem w /usr/lib.
Jeli filename jest wskanikiem NULL, to zwracany uchwyt wskazuje na
program glowny.
Zewntrzne odniesienia biblioteki s rozstrzygane przy uyciu bibliotek z
listy zalenoci danej biblioteki, oraz przy uyciu wszystkich innych
bibliotek, otwartych wczeniej ze znacznikiem RTLD_GLOBAL. Jeli plik
wykonywalny byl skonsolidowany z opcj "-rdynamic", to globalne symbole
pliku wykonywalnego bd take uywane do rozstrzygania odniesie
dynamicznie zaladowanych bibliotek.
flag powinna by albo RTLD_LAZY, oznaczajcym rozwizywanie
niezdefiniowanych symboli podczas wywolywania biblioteki dynamicznej,
albo RTLD_NOW, oznaczajcym rozwizanie wszystkich niezdefiniowanych
symboli zanim dlopen powroci i nie powiedzie si, jeli nie mona tego
dokona. Ewentualnie mona wykona operacj OR na parametrze flag, i
symbolu RTLD_GLOBAL, oznaczajcym, e symbole zewntrzne, zdefiniowane w
bibliotece bd udostpniane kolejno ladowanym bibliotekom.
Jeli biblioteka eksportuje funkcj o nazwie _init, to jej kod jest
wykonywany przed powrotem dlopen. Jeli ta sama biblioteka jest
zaladowana przez dlopen() dwukrotnie, to zwracany jest ten sam uchwyt.
Biblioteka dl obsluguje liczniki dowiza dla uchwytow plikow
dynamicznych, tak wic biblioteka dynamiczna nie bdzie zdealokowana nim
tylokrotnie nie zostanie wywolana funkcja dlclose, ilokrotnie uyto
dlopen.
Jeli dlopen z jakiej przyczyny zawiedzie, to zwraca NULL. Czytelny dla
czlowieka napis, zawierajcy opis ostatniego bldu, ktory pojawil si w
ktorej z funkcji dl (dlopen, dlsym lub dlclose), mona wycign przy uyciu
dlerror(). dlerror zwraca NULL, jeli od czasu inicjalizacji lub
poprzedniego wywolania dlerror nie wystpil bld. (Wywolanie dlerror()
dwa razy pod rzd zawsze spowoduje, e drugie wywolanie zwroci NULL.)
dlsym pobiera "uchwyt" biblioteki dynamicznej, zwrocony przez dlopen i
zakoczon znakiem NUL nazw symbolu. Zwraca adres, pod ktorym zaladowany
jest ten symbol. Jeli symbol nie zostanie znaleziony, to dlsym zwraca
NULL; jednak prawidlowym sposobem sprawdzenia czy podczas wykonania
dlsym wystpil bld, jest zapisanie wyniku dlerror do zmiennej i
sprawdzenie, czy warto ta nie jest rowna NULL. Jest tak dlatego, e
warto symbolu moe w rzeczywistoci wynosi NULL. Konieczne jest te
zachowywanie wynikow dlerror, gdy ponowne wywolanie dlerror zwroci
NULL.
Istniej dwa specialne pseudo-uchwyty: RTLD_DEFAULT i RTLD_NEXT.
Pierwszy z nich znajdzie pierwsze wystpienie danego symbolu korzystajc
z domylnego dla biblioteki kolejnoci poszukiwania. Drugi z nich,
przydatny tylko wewntrz bibliotek dynamicznych, znajdzie nastpne
wystpienie funkcji dla kolejnoci poszukiwania obowizujcej po
zaladowaniu biecej biblioteki. Pozwala to zastpienie funkcji w innej
bibliotece dzielonej.
dlclose zmniejsza o jeden licznik odniesie w uchwycie bibliotek
dynamicznych handle. Jeli licznik spada do zera a inne zaladowane
biblioteki nie uywaj jej symboli, to biblioteka dynamiczna jest
zwalniana. Jeli biblioteka dynamiczna eksportuje funkcj o nazwie _fini,
to jest ona wykonywana bezporednio przed zwolnieniem tej biblioteki.
WARTO ZWRACANA
dlclose zwraca 0 przy pomylnym zakoczeniu, z warto niezerow w przypadku
bldu.
PRZYK/LAD
Za/ladowanie biblioteki matematycznej i wypisanie cosinusa liczby 2.0:
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("libm.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fprintf (stderr, "%s\n", error);
exit(1);
}
printf ("%f\n", (*cosine)(2.0));
dlclose(handle);
return 0;
}
Gdyby ten program znajdowal si w pliku o nazwie "foo.c", mona by go
zbudowa za pomoc nastpujcego polecenia:
gcc -rdynamic -o foo foo.c -ldl
UWAGI
Symbole RTLD_DEFAULT i RTLD_NEXT s zdefiniowane w <dlfcn.h> tylko
wtedy, gdy _GNU_SOURCE bylo zdefiniowane przed jego wlczeniem.
Standard interfejsu dlopen pochodzi z SunOS.
ZOBACZ TAKE
ld(1), ld.so(8), ldconfig(8), ldd(1), ld.so.info
INFORMACJE O T/LUMACZENIU
Powysze tlumaczenie pochodzi z nieistniejcego ju Projektu Tlumaczenia
Manuali i moe nie by aktualne. W razie zauwaenia ronic midzy powyszym
opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji,
prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.