Provided by: manpages-pl-dev_20060617-3_all bug

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.