.\" -*- coding: UTF-8 -*-
'\" t
.\" Copyright 1995 Yggdrasil Computing, Incorporated.
.\" written by Adam J. Richter (adam@yggdrasil.com),
.\" with typesetting help from Daniel Quinlan (quinlan@yggdrasil.com).
.\" and Copyright 2003, 2015 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: GPL-2.0-or-later
.\"
.\" Modified by David A. Wheeler <dwheeler@dwheeler.com> 2000-11-28.
.\" Applied patch by Terran Melconian, aeb, 2001-12-14.
.\" Modified by Hacksaw <hacksaw@hacksaw.org> 2003-03-13.
.\" Modified by Matt Domsch, 2003-04-09: _init and _fini obsolete
.\" Modified by Michael Kerrisk <mtk.manpages@gmail.com> 2003-05-16.
.\" Modified by Walter Harms: dladdr, dlvsym
.\" Modified by Petr Baudis <pasky@suse.cz>, 2008-12-04: dladdr caveat
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH dlopen 3 "15 czerwca 2024 r." "Linux man\-pages 6.9.1" 
.SH NAZWA
dlclose, dlopen, dlmopen \- otwiera i zamyka obiekt dzielony
.SH BIBLIOTEKA
Biblioteka konsolidacji dynamicznej (\fIlibdl\fP, \fI\-ldl\fP)
.SH SKŁADNIA
.nf
\fB#include <dlfcn.h>\fP
.P
\fBvoid *dlopen(const char *\fP\fIfilename\fP\fB, int \fP\fIflags\fP\fB);\fP
\fBint dlclose(void *\fP\fIhandle\fP\fB);\fP
.P
\fB#define _GNU_SOURCE\fP
.br
\fB#include <dlfcn.h>\fP
.P
\fBvoid *dlmopen(Lmid_t \fP\fIlmid\fP\fB, const char *\fP\fIfilename\fP\fB, int \fP\fIflags\fP\fB);\fP
.fi
.SH OPIS
.SS dlopen()
Funkcja \fBdlopen\fP() ładuje dynamiczny obiekt dzielony (bibliotekę dzieloną)
pliku, o nazwie zawartej w zakończonym znakiem nul łańcuchu \fIfilename\fP i
zwraca nieprzezroczysty \[Bq]uchwyt\[rq] dla tego obiektu
dzielonego. Uchwytu tego używa się z innymi funkcjami z API dlopen, takimi
jak \fBdlsym\fP(3), \fBdladdr\fP(3), \fBdlinfo\fP(3) i \fBdlclose\fP().
.P
.\" FIXME On Solaris, when handle is NULL, we seem to get back
.\" a handle for (something like) the root of the namespace.
.\" The point here is that if we do a dlmopen(LM_ID_NEWLM), then
.\" the filename==NULL case returns a different handle than
.\" in the initial namespace. But, on glibc, the same handle is
.\" returned. This is probably a bug in glibc.
.\"
Jeśli \fIfilename\fP wynosi NULL, to zwracany jest uchwyt do głównego
programu. Jeśli \fIfilename\fP zawiera ukośnik (\[Bq]/\[rq]), to jest
interpretowana jako (względna lub absolutna) ścieżka. W innych sytuacjach,
konsolidator dynamiczny szuka obiektu w następujący sposób (więcej
szczegółów w podręczniku \fBld.so\fP(8)):
.IP \[bu] 3
(tylko ELF) Jeśli wywołujący obiekt (tj. biblioteka współdzielona, lub plik
wykonywalny, z którego wywoływane jest \fBdlopen\fP()) zawiera znacznik
DT_RPATH, natomiast nie zawiera znacznika DT_RUNPATH, to przeszukiwane są
katalogi wypisane w znaczniku DT_RPATH.
.IP \[bu]
Jeśli, w momencie uruchomienia tego programu, zdefiniowano zmienną
środowiskową \fBLD_LIBRARY_PATH\fP i zawierała ona listę katalogów
rozdzielonych dwukropkiem, to przeszukiwane są te katalogi (ze względów
bezpieczeństwa, zmienna ta jest ignorowana w przypadku programów z
ustawionym bitem set\-user\-ID lub set\-group\-ID).
.IP \[bu]
(tylko ELF) Jeśli wywołujący obiekt zawiera znacznik DT_RUNPATH, to
przeszukiwane są katalogi wypisane w tym znaczniku.
.IP \[bu]
Sprawdzany jest plik bufora \fI/etc/ld.so.cache\fP (zarządzany przez
\fBldconfig\fP(8)) pod kątem zawierania wpisu dla \fIfilename\fP.
.IP \[bu]
Przeszukiwane są katalogi \fI/lib\fP i \fI/usr/lib\fP (w tej kolejności).
.P
Jeśli obiekt określony w \fIfilename\fP ma zależności od innych obiektów
dzielonych, są one również automatycznie ładowane przez konsolidator
dynamiczny, za pomocą tych samych reguł (proces ten może postępować
rekurencyjnie, jeśli te obiekty mają z kolei swoje zależności itd.).
.P
We \fIflags\fP należy podać jedną z dwóch poniższych wartości:
.TP 
\fBRTLD_LAZY\fP
.\" commit 12b5b6b7f78ea111e89bbf638294a5413c791072
Przeprowadza leniwe dowiązanie. Rozwiązuje symbole jedynie wtedy, gdy
wykonywany jest kod, który się do nich odnosi. Jeśli do danego symbolu nic
się nie odniesie, to nie zostanie nigdy rozwiązany (leniwe dowiązanie jest
wykonywane tylko przy odniesieniach do funkcji; odniesienia do zmiennych są
zawsze bezzwłocznie przypisywane przy ładowaniu obiektu dzielonego). Od
glibc 2.1.1, znacznik ten jest przesłaniany przez efekt zmiennej
środowiskowej \fBLD_BIND_NOW\fP.
.TP 
\fBRTLD_NOW\fP
Jeśli poda się tę wartość lub zmienna środowiskowa \fBLD_BIND_NOW\fP jest
ustawiona na niepusty łańcuch, wszystkie niezdefiniowane symbole obiektu
dzielonego są rozwiązywane przed powrotem \fBdlopen\fP(). Jeśli nie da się tego
wykonać, zwracany jest błąd.
.P
Ponadto, we \fIflags\fP można zsumować (OR) zero lub więcej z poniższych
wartości:
.TP 
\fBRTLD_GLOBAL\fP
Symbole zdefiniowane za pomocą tego obiektu dzielonego zostaną udostępnione
do rozwiązywania symboli kolejno ładowanych obiektów dzielonych.
.TP 
\fBRTLD_LOCAL\fP
Jest to odwrotność \fBRTLD_GLOBAL\fP, a także wartość domyślna, jeśli nie
podano żadnego znacznika. Symbole zdefiniowane w tym obiekcie dzielonym nie
są udostępniane do rozwiązywania symboli kolejno ładowanych obiektów
dzielonych.
.TP 
\fBRTLD_NODELETE\fP (od glibc 2.2)
Nie odłącza obiektu dzielonego podczas \fBdlclose\fP(). Statyczne i globalne
zmienne obiektu nie są zatem inicjowane ponownie, jeśli obiekt zostanie
później przeładowany za pomocą \fBdlopen\fP().
.TP 
\fBRTLD_NOLOAD\fP (od glibc 2.2)
.\"
Nie ładuje obiektu dzielonego. Można to wykorzystać do sprawdzenia, czy
obiekt jest już rezydentny (\fBdlopen\fP() zwróci NULL jeśli nie jest, albo
uchwyt obiektu jeśli jest). Znacznik może posłużyć również do dodania
znaczników do już załadowanego obiektu dzielonego. Przykładowo, wcześniej
załadowany obiekt dzielony ze znacznikiem \fBRTLD_LOCAL\fP może być otwarty
ponownie z \fBRTLD_NOLOAD\ |\ RTLD_GLOBAL\fP.
.TP 
\fBRTLD_DEEPBIND\fP (od glibc 2.3.4)
.\" Inimitably described by UD in
.\" http://sources.redhat.com/ml/libc-hacker/2004-09/msg00083.html.
Umieszcza dziedzinę przeszukiwania dla symboli, w tym obiekcie dzielonym
przed dziedziną globalną. Oznacza to, że samodzielny obiekt będzie
preferował używanie swoich symboli, zamiast symboli globalnych o tej samej
nazwie w obiektach, które zostały już załadowane.
.P
Jeśli \fIfilename\fP wynosi NULL, to zwracany jest uchwyt do głównego
programu. Przy przekazaniu tego uchwytu do \fBdlsym\fP(3), powoduje on
wyszukiwanie symbolu w głównym programie, następnie we wszystkich obiektach
dzielonych załadowanych przy rozruchu programu, a potem we wszystkich
obiektach dzielonych załadowanych za pomocą \fBdlopen\fP() ze znacznikiem
\fBRTLD_GLOBAL\fP.
.P
Odniesienia symboli w obiekcie dzielonym są rozwiązywane za pomocą (w tej
kolejności): symboli w mapie linkowań obiektów załadowanych do głównego
programu i jego zależności; symboli w obiektach dzielonych (i ich
zależności), które były uprzednio otworzone za pomocą \fBdlopen\fP() i
znacznika \fBRTLD_GLOBAL\fP; definicji w samym obiekcie dzielonym (i
zależności, które zostały załadowane dla tego obiektu).
.P
Wszelkie symbole globalne w pliku wykonywalnym, które zostały umieszczone w
jego tablicy symboli dynamicznych przez \fBld\fP(1), mogą być użyte również do
rozwiązywania odniesień w dynamicznie załadowanym obiekcie
dzielonym. Symbole mogą być umieszczone w tablicy symboli dynamicznych albo
ponieważ plik wykonywalny skonsolidowano z \[Bq]\-rdynamic\[rq] (lub
synonimicznie: z \[Bq]\-\-export\-dynamic\[rq]), co powoduje umieszczenie
wszystkich symboli globalnych pliku wykonywalnego w tablicy symboli
dynamicznych, albo z powodu odnotowania przez \fBld\fP(1) zależności od symbolu
w innym obiekcie, podczas konsolidowania statycznego.
.P
Jeśli ten sam obiekt dzielony zostanie powtórnie otworzony za pomocą
\fBdlopen\fP(), to zwracany jest ten sam uchwyt obiektu. Dynamiczny
konsolidator utrzymuje liczniki odniesień dla uchwytów obiektów, tak więc
dynamicznie załadowany obiekt dzielony nie jest dealokowany, dopóki
\fBdlclose\fP() nie zostanie na nim wywołany tak wiele razy, jak udanie
wywołano na nim \fBdlopen\fP(). Konstruktory (zob. niżej) są wywoływane tylko
wtedy, gdy obiekt jest faktycznie ładowany do pamięci (tj. gdy licznik
odniesień wzrośnie do 1).
.P
Kolejne wywołanie \fBdlopen\fP(), ładujące ten sam obiekt za pomocą
\fBRTLD_NOW\fP, może wymusić rozwiązanie symbolu dla obiektu dzielonego
wcześniej załadowanego za pomocą \fBRTLD_LAZY\fP. Podobnie, obiekt uprzednio
załadowany za pomocą \fBRTLD_LOCAL\fP może awansować na \fBRTLD_GLOBAL\fP w
kolejnym wywołaniu \fBdlopen\fP().
.P
.\"
Jeśli \fBdlopen\fP() z jakiegoś powodu zawiedzie, zwróci NULL.
.SS dlmopen()
Funkcja ta wykonuje te same zadania co \fBdlopen\fP() \[em] argumenty
\fIfilename\fP i \fIflags\fP oraz wartości zwraca są takie same, z wyjątkiem
różnic opisanych niżej.
.P
Funkcja \fBdlmopen\fP() różni się od \fBdlopen\fP() głównie tym, że akceptuje
dodatkowy argument, \fIlmid\fP, który określa listę map linkowań (link\-map) (do
której można odnosić się również jako \fInamespace\fP), w której obiekt
dzielony powinien być załadowany (dla porównania, \fBdlopen\fP() dodaje
dynamicznie ładowany obiekt dzielony do tej samej przestrzeni nazw, jak
obiekt dzielony, z którego wywołano \fBdlopen\fP()). Typ \fILmid_t\fP jest
nieprzezroczystym uchwytem odnoszącym się do tej przestrzeni nazw.
.P
.\" FIXME: Is using dlinfo() RTLD_DI_LMID the right technique?
Argument \fIlmid\fP jest albo identyfikatorem istniejącej przestrzeni nazw
(który można pozyskać za pomocą żądania \fBRTLD_DI_LMID\fP \fBdlinfo\fP(3)) lub
jedną z następujących wartości specjalnych:
.TP 
\fBLM_ID_BASE\fP
Ładuje obiekt dzielony w pierwotnej przestrzeni nazw (tj. w przestrzeni nazw
aplikacji).
.TP 
\fBLM_ID_NEWLM\fP
Tworzy nową przestrzeń nazw i ładuje w niej obiekt dzielony. Obiekt musi być
prawidłowo skonsolidowany do odniesień wszystkich innych obiektów dzielonych
jakich wymaga, ponieważ nowa przestrzeń nazw jest początkowo pusta.
.P
Jeśli \fIfilename\fP wynosi NULL, to jedyną dopuszczalną wartością \fIlmid\fP jest
\fBLM_ID_BASE\fP.
.SS dlclose()
Funkcja \fBdlclose\fP() zmniejsza licznik odniesień na dynamicznie załadowanych
obiektach, do których odnosi się \fIhandle\fP.
.P
Jeśli licznik odniesień obiektu spadnie do zera, a żadne symbole w tym
obiekcie nie są wymagane przez inne obiekty, obiekt ten jest odłączany po
pierwszym wywołaniu dowolnych destruktorów zdefiniowanych dla obiektu
(symbole w obiekcie mogą być wymagane przez inny obiekt, ponieważ otworzono
go ze znacznikiem \fBRTLD_GLOBAL\fP, a jeden z jego symboli umożliwił relokację
w innym obiekcie).
.P
Wszystkie obiekty dzielone załadowane automatycznie, gdy \fBdlopen\fP()
przywołano na obiekcie, do którego odnosi się \fIhandle\fP, są rekurencyjnie
zamykane w ten sam sposób.
.P
Pomyślny powrót z \fBdlclose\fP() nie gwarantuje, że symbole powiązane z
\fIhandle\fP są usunięte z przestrzeni adresowej wywołującego. Oprócz odniesień
wynikających z bezpośrednich wywołań \fBdlopen\fP(), mogły zostać
niebezpośrednio załadowane obiekty dzielone (i policzone odniesienia), ze
względu na zależności w innych obiektach dzielonych. Tylko gdy wszystkie
odniesienia zostały uwolnione, obiekt dzielony może być usunięty z
przestrzeni adresowej.
.SH "WARTOŚĆ ZWRACANA"
W przypadku powodzenia, \fBdlopen\fP() i \fBdlmopen\fP() zwracają uchwyt do
ładowanego obiektu, niebędący NULL\-em. W razie wystąpienia błędu (nie można
znaleźć pliku, nie był odczytywalny, miał zły format lub spowodował błędy
przy załadowaniu) funkcje te zwracają NULL.
.P
W przypadku powodzenia, \fBdlclose\fP() zwraca 0; w razie wystąpienia błędu,
zwraca wartość niezerową.
.P
Błędy z opisywanych funkcji można diagnozować za pomocą \fBdlerror\fP(3).
.SH ATRYBUTY
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku
\fBattributes\fP(7).
.TS
allbox;
lbx lb lb
l l l.
Interfejs	Atrybut	Wartość
T{
.na
.nh
\fBdlopen\fP(),
\fBdlmopen\fP(),
\fBdlclose\fP()
T}	Bezpieczeństwo wątkowe	MT\-bezpieczne
.TE
.SH STANDARDY
.TP 
\fBdlopen\fP()
.TQ
\fBdlclose\fP()
POSIX.1\-2008.
.TP 
\fBdlmopen\fP()
.TQ
\fBRTLD_NOLOAD\fP
.TQ
\fBRTLD_NODELETE\fP
GNU.
.TP 
\fBRTLD_DEEPBIND\fP
Solaris.
.SH HISTORIA
.TP 
\fBdlopen\fP()
.TQ
\fBdlclose\fP()
glibc 2.0.  POSIX.1\-2001.
.TP 
\fBdlmopen\fP()
glibc 2.3.4.
.SH UWAGI
.SS "dlmopen() i przestrzenie nazw"
Lista map linków (link\-map) definiuje izolowaną przestrzeń nazw do
rozwiązywania symboli przez konsolidator dynamiczny. Wewnątrz przestrzeni
nazw, zależny obiekt dzielony jest niebezpośrednio ładowany zgodnie ze
zwykłymi regułami, a odniesienia do symboli są podobnie rozwiązywane zgodnie
ze zwykłymi regułami, lecz rozwiązywanie to jest ograniczone do definicji
zapewnionych przez obiekty, które zostały (bezpośrednio lub niebezpośrednio)
załadowane do tej przestrzeni nazw.
.P
Funkcja \fBdlmopen\fP() pozwala na izolację załadowań obiektów \[em] możliwość
załadowania obiektu dzielonego do nowej przestrzeni nazw, bez ujawniania
reszcie aplikacji symboli udostępnionych przez nowy obiekt. Proszę zauważyć,
że użycie znacznika \fBRTLD_LOCAL\fP nie jest wystarczające do tego celu,
ponieważ zapobiega ono udostępnieniu symboli obiektu dzielonego dla
\fIwszystkich\fP innych obiektów dzielonych. W niektórych przypadkach, zachodzi
potrzeba udostępnienia symboli zapewnionych przez dynamicznie załadowany
obiekt dzielony dla (podzbioru) innych obiektów dzielonych, bez ujawniania
tych symboli całej aplikacji. Można to uzyskać za pomocą oddzielnej
przestrzeni nazw i znacznika \fBRTLD_GLOBAL\fP.
.P
Funkcja \fBdlmopen\fP() może służyć również do zapewnienia lepszej izolacji,
niż znacznik \fBRTLD_LOCAL\fP. W szczególności, obiekty dzielone załadowane za
pomocą \fBRTLD_LOCAL\fP mogą być awansowane do \fBRTLD_GLOBAL\fP, jeśli są
zależnościami innego obiektu dzielonego załadowanego ze znacznikiem
\fBRTLD_GLOBAL\fP. Z tego względu, \fBRTLD_LOCAL\fP jest niewystarczające do
izolowania załadowanego obiektu dzielonego, z wyjątkiem (nieczęstej)
sytuacji, gdy ma się całkowitą kontrolę nad wszystkich zależnościami obiektu
dzielonego.
.P
Możliwe zastosowania \fBdlmopen\fP() to wtyczki, gdzie autor struktury
ładowania wtyczek nie może ufać autorom wtyczek i nie chce, aby jakiekolwiek
niezdefiniowane symbole ze struktury wtyczek były rozwiązywane do symboli
wtyczek. Kolejne zastosowanie, to ładowanie tego samego obiektu więcej niż
raz. Bez korzystania z \fBdlmopen\fP(), wymagałoby to utworzenia odrębnej kopii
pliku obiektu dzielonego. Za pomocą \fBdlmopen\fP(), można to uzyskać ładując
ten sam plik obiektu dzielonego do różnych przestrzeni nazw.
.P
.\" DL_NNS
.\"
Implementacja glibc obsługuje co najwyżej 16 przestrzeni nazw.
.SS "Funkcje inicjalizacji i kończenia"
.\" info gcc "C Extensions" "Function attributes"
Obiekty dzielone mogą eksportować funkcje za pomocą atrybutów funkcji
\fB__attribute__((constructor))\fP i \fB__attribute__((destructor))\fP. Funkcje
konstrukcyjne są wykonywane przed powrotem \fBdlopen\fP(), a funkcje
destrukcyjne są wykonywane przez powrotem \fBdlclose\fP(). Obiekty dzielone
mogą eksportować wiele konstruktorów i destruktorów, a każdej funkcji można
przypisać priorytety, aby określić kolejność wykonywania. Więcej informacji
na stronach info \fBgcc\fP (w rozdziale \[Bq]Function attributes\[rq]).
.P
Starszą metodą uzyskiwania (częściowo) tego samego wyniku jest użycie dwóch
symboli specjalnych rozpoznawanych przez konsolidator: \fB_init\fP i
\fB_fini\fP. Jeśli dynamicznie ładowany obiekt dzielony eksportuje algorytm
nazwany \fB_init\fP(), to kod ten jest wykonywany po załadowaniu obiektu
dzielonego, przed powrotem \fBdlopen\fP(). Jeśli obiekt dzielony eksportuje
algorytm nazwany \fB_fini\fP(), to jest on wywoływany zaraz przed odłączeniem
obiektu. W tym przypadku, konieczne jest unikania linkowania wobec
rozruchowych plików systemowych, które zawierają domyślne wersje tych
plików; można to uczynić za pomocą opcji wiersza poleceń \fBgcc\fP(1)
\fI\-nostartfiles\fP.
.P
.\"
.\" Using these routines, or the gcc
.\" .B \-nostartfiles
.\" or
.\" .B \-nostdlib
.\" options, is not recommended.
.\" Their use may result in undesired behavior,
.\" since the constructor/destructor routines will not be executed
.\" (unless special measures are taken).
.\" .\" void _init(void) __attribute__((constructor));
.\" .\" void _fini(void) __attribute__((destructor));
.\"
Używanie \fB_init\fP i \fB_fini\fP jest obecnie przestarzałe, na korzyść opisanych
wcześniej konstruktorów i destruktorów, które oprócz innych zalet, pozwalają
na zdefiniowanie wielu funkcji inicjalizacji i kończenia.
.P
Od glibc 2.2.3, \fBatexit\fP(3) może posłużyć do zarejestrowania uchwytu
wyjścia, który jest automatycznie wywoływany przez odłączaniu obiektu
dzielonego.
.SS Historia
Funkcje te są częścią API dlopen, wywodzącego się z SunOS.
.SH USTERKI
.\" dlerror(): "invalid mode"
.\" https://sourceware.org/bugzilla/show_bug.cgi?id=18684
Według stanu na glibc 2.24, podanie znacznika \fBRTLD_GLOBAL\fP przy
wywoływaniu \fBdlmopen\fP() generuje błąd. Co więcej, podanie \fBRTLD_GLOBAL\fP
przy wywoływaniu \fBdlopen\fP() powoduje załamanie programu (\fBSIGSEGV\fP), jeśli
wywołanie nastąpiło z dowolnego obiektu załadowanego w przestrzeni nazw
innej niż pierwotna przestrzeń nazw.
.SH PRZYKŁADY
Poniższy program ładuje bibliotekę matematyczną (glibc), szuka adresu
funkcji \fBcos\fP(3) i wypisuje cosinus liczby 2.0. Pokazano przykład tworzenia
i działania programu:
.P
.in +4n
.EX
$ \fBcc dlopen_demo.c \-ldl\fP
$ \fB./a.out\fP
\-0.416147
.EE
.in
.SS "Kod źródłowy programu"
.\" SRC BEGIN (dlopen.c)
\&
.EX
.\" http://pubs.opengroup.org/onlinepubs/009695399/functions/dlsym.html#tag_03_112_08
.\" http://pubs.opengroup.org/onlinepubs/9699919799/functions/dlsym.html#tag_16_96_07
.\" http://austingroupbugs.net/view.php?id=74
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
\&
#include <gnu/lib\-names.h>  /* Definiuje LIBM_SO (będzie to
                               łańcuch podobny do "libm.so.6") */
int
main(void)
{
    void *handle;
    double (*cosine)(double);
    char *error;
\&
    handle = dlopen(LIBM_SO, RTLD_LAZY);
    if (!handle) {
        fprintf(stderr, "%s\[rs]n", dlerror());
        exit(EXIT_FAILURE);
    }
\&
    dlerror();    /* Czyści ewentualne istniejące błędy */
\&
    cosine = (double (*)(double)) dlsym(handle, "cos");
\&
    /* Zgodnie ze standardem ISO C, rzutowanie pomiędzy wskaźnikami
       funkcji a \[aq]void *\[aq], jak poniżej, daje niezdefiniowany wynik.
       POSIX.1\-2001 i POSIX.1\-2008 akceptują ten stan rzeczy i proponują
       następujące obejście problemu:
\&
           *(void **) (&cosine) = dlsym(handle, "cos");
\&
       To (niezgrabne) rzutowanie jest zgodne ze standem ISO C i uniknie
       ostrzeżeń kompilatora.
\&
       2013 Technical Corrigendum 1 do POSIX.1\-2008 poprawia stan rzeczy,
       wymagając od zgodnych implementacji obsługi rzutowań \[aq]void *\[aq]
       do wskaźnika funkcji. Tym niemniej, niektóre kompilatory (np. gcc
       z opcją \[aq]\-pedantic\[aq]) mogą narzekać na rzutowanie użyte
       w tym programie. */
\&
    error = dlerror();
    if (error != NULL) {
        fprintf(stderr, "%s\[rs]n", error);
        exit(EXIT_FAILURE);
    }
\&
    printf("%f\[rs]n", (*cosine)(2.0));
    dlclose(handle);
    exit(EXIT_SUCCESS);
}
.EE
.\" SRC END
.SH "ZOBACZ TAKŻE"
\fBld\fP(1), \fBldd\fP(1), \fBpldd\fP(1), \fBdl_iterate_phdr\fP(3), \fBdladdr\fP(3),
\fBdlerror\fP(3), \fBdlinfo\fP(3), \fBdlsym\fP(3), \fBrtld\-audit\fP(7), \fBld.so\fP(8),
\fBldconfig\fP(8)
.P
strony info gcc, strony info ld
.PP
.SH TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika:
Przemek Borys <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>
i
Michał Kułach <michal.kulach@gmail.com>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
