Provided by: manpages-pl-dev_0.6-2_all bug

NAZWA

       dlclose,  dlerror,  dlopen,  dlsym - interfejs programisty dla dynamicznie konsolidującego
       loadera

SKŁADNIA

       #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

        Uwaga! To tłumaczenie może być nieaktualne!

       dlopen ładuje bibliotekę dynamiczną z pliku, o nazwie zawartej w zakończonym  znakiem  NUL
       łańcuchu  filename  i  zwraca  nieprzezroczysty  "uchwyt"  dla tej biblioteki dynamicznej.
       Jeśli filename nie jest ścieżką absolutną (np. nie rozpoczyna się od "/"),  to  plik  jest
       poszukiwany w następujących miejscach:

              Rozdzielonej  dwukropkami  liście katalogów, zdefiniowanej w zmiennej środowiskowej
              LD_LIBRARY_PATH.

              Liście bibliotek podanej w /etc/ld.so.cache.

              /lib, a potem w /usr/lib.

       Jeśli filename jest wskaźnikiem NULL, to zwracany uchwyt wskazuje na program główny.

       Zewnętrzne odniesienia biblioteki są rozstrzygane przy użyciu bibliotek z listy zależności
       danej  biblioteki,  oraz  przy  użyciu wszystkich innych bibliotek, otwartych wcześniej ze
       znacznikiem RTLD_GLOBAL.  Jeśli plik wykonywalny był skonsolidowany z  opcją  "-rdynamic",
       to  globalne  symbole  pliku  wykonywalnego  będą także używane do rozstrzygania odniesień
       dynamicznie załadowanych bibliotek.

       flag powinna być albo  RTLD_LAZY,  oznaczającym  rozwiązywanie  niezdefiniowanych  symboli
       podczas  wywoływania  biblioteki  dynamicznej,  albo  RTLD_NOW,  oznaczającym  rozwiązanie
       wszystkich niezdefiniowanych symboli zanim dlopen powróci i nie powiedzie się,  jeśli  nie
       można  tego  dokonać.  Ewentualnie można wykonać operację OR na parametrze flag, i symbolu
       RTLD_GLOBAL,  oznaczającym,  że  symbole  zewnętrzne,  zdefiniowane  w   bibliotece   będą
       udostępniane kolejno ładowanym bibliotekom.

       Jeśli  biblioteka  eksportuje  funkcję  o  nazwie  _init, to jej kod jest wykonywany przed
       powrotem dlopen. Jeśli ta sama biblioteka jest załadowana przez  dlopen()  dwukrotnie,  to
       zwracany  jest  ten  sam  uchwyt.  Biblioteka  dl obsługuje liczniki dowiązań dla uchwytów
       plików  dynamicznych,  tak  więc  biblioteka  dynamiczna  nie  będzie   zdealokowana   nim
       tylokrotnie nie zostanie wywołana funkcja dlclose, ilokrotnie użyto dlopen.

       Jeśli dlopen z jakiejś przyczyny zawiedzie, to zwraca NULL.  Czytelny dla człowieka napis,
       zawierający opis ostatniego błędu, który pojawił się w którejś z funkcji dl (dlopen, dlsym
       lub  dlclose), można wyciągnąć przy użyciu dlerror().  dlerror zwraca NULL, jeśli od czasu
       inicjalizacji lub poprzedniego wywołania dlerror nie wystąpił błąd.  (Wywołanie  dlerror()
       dwa razy pod rząd zawsze spowoduje, że drugie wywołanie zwróci NULL.)

       dlsym  pobiera "uchwyt" biblioteki dynamicznej, zwrócony przez dlopen i zakończoną znakiem
       NUL nazwę symbolu. Zwraca adres, pod którym załadowany jest ten symbol. Jeśli  symbol  nie
       zostanie  znaleziony,  to  dlsym  zwraca NULL; jednak prawidłowym sposobem sprawdzenia czy
       podczas wykonania dlsym wystąpił  błąd,  jest  zapisanie  wyniku  dlerror  do  zmiennej  i
       sprawdzenie,  czy  wartość  ta  nie jest równa NULL.  Jest tak dlatego, że wartość symbolu
       może w rzeczywistości wynosić NULL.  Konieczne jest też zachowywanie wyników dlerror, gdyż
       ponowne wywołanie dlerror zwróci NULL.

       Istnieją dwa specialne pseudo-uchwyty: RTLD_DEFAULT i RTLD_NEXT.  Pierwszy z nich znajdzie
       pierwsze wystąpienie żądanego symbolu korzystając z domyślnego dla  biblioteki  kolejności
       poszukiwania.  Drugi  z  nich,  przydatny  tylko wewnątrz bibliotek dynamicznych, znajdzie
       następne wystąpienie funkcji dla  kolejności  poszukiwania  obowiązującej  po  załadowaniu
       bieżącej biblioteki.  Pozwala to zastąpienie funkcji w innej bibliotece dzielonej.

       dlclose  zmniejsza  o  jeden  licznik  odniesień w uchwycie bibliotek dynamicznych handle.
       Jeśli licznik spada do zera a inne załadowane  biblioteki  nie  używają  jej  symboli,  to
       biblioteka  dynamiczna  jest  zwalniana.  Jeśli biblioteka dynamiczna eksportuje funkcję o
       nazwie _fini, to jest ona wykonywana bezpośrednio przed zwolnieniem tej biblioteki.

WARTOŚĆ ZWRACANA

       dlclose zwraca 0 przy pomyślnym zakończeniu, z wartość niezerową w przypadku błędu.

PRZYKŁAD

       Załadowanie 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 znajdował się w pliku o nazwie "foo.c", można by go zbudować  za  pomocą
       następującego 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
       było zdefiniowane przed jego włączeniem.  Standard interfejsu dlopen pochodzi z SunOS.

ZOBACZ TAKŻE

       ld(1), ld.so(8), ldconfig(8), ldd(1), ld.so.info

INFORMACJE O TŁUMACZENIU

       Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia  Manuali  i  może
       nie  być  aktualne.  W  razie  zauważenia  różnic  między  powyższym opisem a rzeczywistym
       zachowaniem opisywanego programu lub  funkcji,  prosimy  o  zapoznanie  się  z  oryginalną
       (angielską) wersją strony podręcznika za pomocą polecenia:

              man --locale=C 3 dlopen

       Prosimy  o  pomoc  w  aktualizacji stron man - więcej informacji można znaleźć pod adresem
       http://sourceforge.net/projects/manpages-pl/.