.\" -*- 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 .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\" Modified by David A. Wheeler 2000-11-28. .\" Applied patch by Terran Melconian, aeb, 2001-12-14. .\" Modified by Hacksaw 2003-03-13. .\" Modified by Matt Domsch, 2003-04-09: _init and _fini obsolete .\" Modified by Michael Kerrisk 2003-05-16. .\" Modified by Walter Harms: dladdr, dlvsym .\" Modified by Petr Baudis , 2008-12-04: dladdr caveat .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH dlopen 3 "2 maja 2024 r." "Linux man\-pages 6.8" .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 \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 \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 #include #include \& #include /* 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\en", 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\en", error); exit(EXIT_FAILURE); } \& printf("%f\en", (*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 Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys , Andrzej Krzysztofowicz i Michał Kułach . .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 .