dlopen

Autres langues

Langue: pl

Autres versions - même langue

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 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

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