System Linux Dlopen w C

System Linux Dlopen w C
Funkcja biblioteki dlopen () jest bardzo przydatną funkcją w języku C. Funkcja ładuje bibliotekę do pamięci po otwarciu nowej. Ogólnie używamy go do załadowania symboli biblioteki, które są nieznane w czasie kompilacji. Dlopen () to funkcja używana w naszych programach. Biblioteka DL implementuje dlopen (), zdefiniowana w DLFCN.H. Dla funkcji Dlopen wymagane są dwa parametry: nazwa pliku biblioteki i flagi. Nazwa pliku jest dynamiczną biblioteką i określa, czy zależności biblioteki są od razu obliczane. Dlopen () zwraca „uchwyt”, który należy uznać za nieprzezroczystą wartość i inne operacje biblioteczne DL. Jeśli próba załadowania nie powiodła się, Dlopen () zwraca null. Ale Dlopen () zwraca ten sam uchwyt pliku, jeśli ładuje tę samą bibliotekę wiele razy.

Korzystając z funkcji Dlopen, kompilator nie bada pod kątem potencjalnych błędów, ponieważ nie jest świadomy typów i prototypów, których używamy. Wydaje się, że wdrożenie funkcji DLOPEN dla standardowego ładowania nie jest promowane, z wyjątkiem kilku drobnych sytuacji. Nawiasem mówiąc, jest to podejście do poprawy introspekcji. Gdy moduł współdzielony jest obecnie wykorzystywany przez inny program, optymalizacja układu pamięci nie jest szczególnie zainteresowana ładowaniem warunkowym. Ślad pamięci nie rośnie, gdy wcześniej używana biblioteka jest ładowana. Unikanie monitorowania kompilatora jest niebezpieczne i zapewnia dobre pisanie błędów. Dodatkowo brakuje nam możliwej optymalizacji kompilatora.

Przykład 1:

Teraz rozważ poniższy przykład, aby zobaczyć funkcjonalność funkcji Dlopen w języku C. W pierwszym kroku ładujemy niektóre standardowe biblioteki C. Tutaj ładujemy nową bibliotekę „DLFCN.h ”, który służy do definiowania makr podczas konstruowania argumentu trybu dlopen.

Następnie wprowadzamy inną bibliotekę w naszym programie „GNU/lib-nazwa.H". Udostępnione pliki biblioteki zawarte w GNU Libc są znalezione przez programy użytkowników zgodnie z makrami, które definiuje. Biblioteka GNU C oferuje podstawowe biblioteki dla systemów operacyjnych GNU i GNU/Linux, a także szeroki zakres innych systemów opartych na systemie Linuksa. Następnie mamy główną implementację metody. Wewnątrz deklarujemy, że obiekt wskaźnika „uchwyt” za pomocą słowa kluczowego void. Deklarujemy funkcję sinusoidalną wskaźnika, która ma podwójny typ danych. Istnieje kolejna deklaracja „błędu” obiektu wskaźnika do obsługi błędów.

Następnie wywołujemy funkcję Dlopen w obiekcie „uchwytu”. Dlopen przyjmuje dwa argumenty: libm_so i „rtld_lazy”. Tutaj „libm_so” to nazwa pliku biblioteki, który zapewnia funkcje matematyczne, takie jak funkcje trygonometryczne. Ta wspólna biblioteka jest wymagana, ponieważ używamy funkcji sinusoidalnej. „RTLD_LAzi” to kolejny argument, który wywołuje funkcję Dlopen. Gdy odwołuje się dany symbol po raz pierwszy, przeniesienie należy przeprowadzić w czasie określonym przez wdrożenie.

Ponieważ proces może nie odwoływać się do każdego symbolu w pliku obiektu wykonywalnego, określenie RTLD Lazy powinno poprawić wydajność w implementacjach, które umożliwiają dynamiczne wiązanie symbolu. Następnie mamy warunek IF-ELSE do obsługi błędów, gdy obiekt uchwytu nie wykonuje funkcji Dlopen. Nazywamy DLERROR, aby wyczyścić błąd.

Funkcja dLerror () zapewnia ciągły łańcuch, który jest czytany przez człowieka i określa raportowanie ostatniego błędu spowodowanego wywołaniem jednego z wywołań API Dlopen od ostatniego wywołania DLERROR. Następnie rzucamy tę funkcję: „(*void **) (& sinus) = dlsym (uchwyt, sin)”. Ponieważ jest to dziwne, casting jest zgodny z ISO C, co pozwala uniknąć ostrzeżeń kompilatora. Zastosujemy funkcję DLSYM, która otrzymuje ścieżkę symbolu określonego w module dynamicznego łącza, który jest dostępny za pomocą funkcji dlopen ().

Ponownie wykonujemy operację IF-ELSE dla błędu standardowego, który jest generowany, gdy dLerror () nie jest null. Następnie mamy instrukcję printf, w której określamy wartość sinusoidalną do obliczenia. W ostatnim kroku zamykamy ten wspólny obiekt, wywołując dlclose dla uchwytu zwróconego przez dlopen ().

#włączać
#włączać
#włączać
#włączać
int
Main (int argc, char ** argv)

Uchwyt void *;
podwójne (*sinus) (podwójne);
błąd char *;
uchwyt = dlopen (libm_so, rtld_lazy);
Jeśli (!uchwyt)
fprintf (stderr, „%s \ n”, dLerror ());
exit (exit_failure);

dLerror ();
*(void **) (& sine) = dlsym (uchwyt, „sin”);
if ((error = dLerror ()) != Null)
fprintf (stderr, „%s \ n”, błąd);
exit (exit_failure);

printf („%f \ n”, (*sinus) (4.0));
dlclose (uchwyt);
exit (exit_success);

Używamy opcji -LDL z poleceniem kompilacji C, ponieważ jest to biblioteka dla połączonego interfejsu Dlopen i jest to wymagane. Po wykonaniu wykonywania pliku Dlopen wyświetla wartość sinusoidalną wcześniejszej wartości.

Przykład 2:

Teraz bierzemy kolejny przykład użycia funkcji Dlopen. Ładujemy nasz program ze wszystkimi wymaganymi bibliotekami C do wdrożenia kodu Dlopen. Następnie rozpoczynamy nasz program w głównej metodzie. Tutaj definiujemy ciąg z deklaracją zmiennej „SRC”. Następnie deklarujemy zmienne wskaźnika „Strlen”, „Uchwyt” i „Błąd”.

Następnie wywołujemy zmienną obsługi i wdrażamy funkcję DLOPEN. Funkcja Dlopen wprowadza bibliotekę współużytkowaną „Libstr.więc ”dla funkcji obsługi ciągów i flagi„ rtld_lazy ”, która jest już wykazana w poprzednim przykładzie. Wzywamy funkcję dLerror w zmiennej „błędu”, aby wyczyścić błąd wygenerowany przez funkcję Dlopen. IF-ELSE jest wykorzystywany do zbadania błędów.

Następnie otrzymujemy adres funkcji Strlen za pomocą funkcji DLSYM i weryfikujemy błędy podczas tego. Następnie używamy funkcji PrintF, aby wywołać funkcję strnlen, aby zwrócić długość podanego ciągu. Ostatecznie zamykamy wspólną bibliotekę z funkcją DLCLOSE.

#włączać
#włączać
#włączać
#włączać
int Main (void)

char* src = "Hello Linux";
int ( *strlen) (const char *);
Uchwyt void *;
błąd char *;
uchwyt = dlopen (”./libstr.więc ", rtld_lazy);
error = dLerror ();
Jeśli(!uchwyt || błąd != Null) printf („Próba ładowania biblioteki nie powiodła się!\ n%s \ n ”, błąd);
return -1;
strlen = dlsym (uchwyt, „strlen”);
error = dLerror ();
Jeśli(!Strlen || error == null) printf ("%s \ n", error); return -1;
printf („Długość łańcucha to:%d \ n”, strlen (src));
dlclose (uchwyt);
powrót 0;

Używamy następującego polecenia do wykonania danego programu. Tutaj flaga -LSTR jest używana dla funkcji długości ciągów, a LDL jest używany do pliku biblioteki Dlopen. Skompilowany program podaje długość łańcucha, jak pokazano w powładzie:

Wniosek

Informacje dotyczące funkcji Dlopen języka C w tym artykule. Mamy krótkie wprowadzenie funkcji Dlopen. Następnie wdrożyliśmy dwa przykłady. Funkcja zwraca identyfikator, który definiuje otwartą bibliotekę. Adresy funkcji wewnątrz otwartej biblioteki są następnie określane za pomocą tego identyfikatora i funkcji DLSYM. Adres funkcji w bibliotece, która została już otwarta za pomocą Dlopen, można znaleźć za pomocą funkcji DLSYM.