Rechercher une page de manuel
dlopen
Langue: pl
Version: 2001-12-14 (openSuse - 09/10/07)
Section: 3 (Bibliothèques de fonctions)
NAZWA
dlclose, dlerror, dlopen, dlsym - interfejs programisty dla dynamicznie konsoliduj±cego loaderaSK£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
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.infoContenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre