dlopen 3






DLOPEN(3) Podręcznik programisty Linuxa DLOPEN(3)


NAZWA
dlclose, dlerror, dlopen, dlsym - Interfejs programisty
dynamicznie linkują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 z pliku, nazwanego w napisie filename bib
liotekę dynamiczną i zwraca nieprzezroczysty "uchwyt" dla
biblioteki dynamicznej. Jeśli filename nie jest ścieżką
absolutną (np. nie rozpoczyna się od "/"), to plik jest
poszukiwany w następujących miejscach:

Oddzielonej dwukropkami liście katalogów, zdefin
iowanej w zmiennej środowiskowej LD_ELF_LIBRARY.
Jeśli, i tylko jeśli LD_ELF_LIBRARY_PATH nie jest
zdefiniowane, to w jego miejscu używane jest
LD_LIBRARY_PATH.

Lista bibliotek podana w /etc/ld.so.cache.

/usr/lib, a potem /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 z flagą RTLD_GLOBAL. Jeśli plik wykonywalny był
zlinkowany z flagą "-rdynamic", to globalne symbole pliku
wykonywalnego będą także używana do rozstrzygania
odniesień dynamicznie załadowanych bibliotek.

flag powinna być jednym z RTLD_LAZY, oznaczającym
rozstrzyganie niezdefiniowanych symboli podczas wywoływa
nia biblioteki dynamicznej, lub RTLD_NOW, oznaczającym
rozstrzygnięcie wszystkich niezdefiniowanych symboli zanim
dlopen powróci i nie powiedzie się, jeśli nie można tego
dokonać. Ewentualnie można zor'ować z flagą symbol
RTLD_GLOBAL, oznaczający, że symbole zewnętrzne, zdefin
iowane w bibliotece będą udostępniane kolejno ładowanym
bibliotekom.

Jeśli biblioteka eksportuje funkcję o nazwie _init, to kod
ten jest wykonywany przed powrotem dlopen. Jeśli ta sama



Linux 16 Maj 1995 1





DLOPEN(3) Podręcznik programisty Linuxa DLOPEN(3)


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. Odczytywalny dla człowieka napis, zawierający opis
ostatniego błędu, który pojawił się w jakiejkolwiek z
funkcji dl (dlopen, dlsym, dlclose), można wyciągnąć przy
użyciu dlerror(). dlerror zwraca NULL, jeśli nie ma nic
do powiedzenia (gdy nie ma błędów, lub był ostatnio
wywołany).

dlsym pobiera "uchwyt" biblioteki dynamicznej, zwróconej
przez dlopen i zakończoną zerem nazwę symbolu, zwracając
adres, pod którym załadowany jest ten symbol. Jeśli sym
bol nie zostanie znaleziony, to dlsym zwraca NULL; jednak
prawidłowym sposobem testowania błędu od dlsym jest
zapisanie wyniku dlerror do zmiennej i sprawdzenie, czy
wartość ta nie jest napisem NULL. Jest tak dlatego, że
wartość symbolu może w rzeczywistości wynosić NULL.
Niezbędnym jest też zachowywanie wyników dlerror ze
względu na to, że dlerror wywołany dwukrotnie zwraca NULL.

dlclose dekrementuje licznik odniesień w uchwycie bib
liotek dynamicznych handle. Jeśli licznik spada do zera i
inne załadowane biblioteki nie używają symboli, to bib
lioteka dynamiczna jest zwalniana. Jeśli biblioteka dynam
iczna eksportuje funkcję o nazwie _fini, to jest ona
wykonywana przed zwolnieniem.

PRZYKŁADY
Załaduj bibliotekę matematyczną i wydrukuj kosinus 2.0:
#include <dlfcn.h>

int main(int argc, char **argv) {
void *handle = dlopen ("/lib/libm.so", RTLD_LAZY);
double (*cosine)(double) = dlsym(handle, "cos");
printf ("%f\n", (*cosine)(2.0));
dlclose(handle);
}

Jeśli program ten byłby w pliku o nazwie "foo.c",
to należy go zbudować następującą komendą:

gcc -rdynamic -o foo foo.c -ldl

Zrób to samo, lecz sprawdź czy nie ma błędów:
#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char **argv) {



Linux 16 Maj 1995 2





DLOPEN(3) Podręcznik programisty Linuxa DLOPEN(3)


void *handle;
double (*cosine)(double);
char *error;

handle = dlopen ("/lib/libm.so", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}

cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}

printf ("%f\n", (*cosine)(2.0));
dlclose(handle);
}

PODZIĘKOWANIA
Standard interfejsu dlopen pochodzi z Solarisa. Linuxowa
implementacja dlopen była początkowo napisana przez Erica
Youngdale z pomocą Mitcha D'Souza, Davida Engela, Hongjiu
Lu, Andreasa Schwaba i innych. Strona podręcznika została
napisana przez Adama Richtera.

ZOBACZ TAKŻE
ld(1), ld.so(8), ldconfig(8), ldd(1).




























Linux 16 Maj 1995 3





Wyszukiwarka

Podobne podstrony:
C dlopen

więcej podobnych podstron