Funkcja DLSYM 3 C

Funkcja DLSYM 3 C
„Linux wymyślił wiele swoich unikalnych funkcji do wykonywania rutynowych zadań. Funkcja DLSym () jest jedną z nich. Celem funkcji dlsym () jest znalezienie adresu zdefiniowanego symbolu określonego w DLL (biblioteka linków dynamicznych), która została udostępniona za pośrednictwem wywołania funkcji dlopen (). Po załadowaniu pliku dynamicznego udostępnionego obiektu (Common Link Library) wskazany przez NULL-zakończone nazwę łańcucha, funkcja dlopen () wyświetla anonimowe „połączenie” dla załadowanego obiektu. Nazwany symbol jest poszukiwana w dynamicznej bibliotece linków (DLL), która została pobrana przez metodę dlopen (). W tym artykule porozmawiamy o użyciu DLSym ().

Jeśli żądany symbol nie jest obecny w tym DLL, zależne biblioteki bibliotek zostaną przeszukiwane przez niego, po jakichkolwiek zależnościach, i tak dalej w sposób pierwszy, dopóki nie zostanie znaleziony żądany symbol lub wszystkie DLL są zostały przeszukane w tym celu. Chociaż sekwencja, w której przeszukiwane są zależne DLL na tym samym poziomie, jest nieokreślona, ​​niniejsza kolejność wyszukiwania określa, w jaki sposób zostaną zidentyfikowane symbole duplikacji w odrębnych DLL. Pamiętaj, że rozładowane zależne biblioteki dynamiczne nie będą ładowane w wyniku poszukiwania DLSYM (). Tylko biblioteki bibliotek, które zostały załadowane jako element DLOPEN () DLL -ów, zostaną skanowane."

RTLD_NOW: Jeśli cała kolekcja zależnych bibliotek musi być udostępniona kolejnym wywołaniom funkcji DLSym (), flaga ta służy do wywoływania dynamicznych bibliotek linków.

Rtld_Lazy: Kiedy używamy tej flagi, nie jesteśmy w stanie znaleźć, które zależne biblioteki dynamiczne są ładowane.

RTLD Global: Nowo załadowane biblioteki mogą używać symboli określonych przez ten pakiet do ustalenia symboli.

RTLD_LOCAL: Ponieważ żadna flaga nie jest wspomniana, jest to przeciwieństwo RTLD Global i domyślnie.

Oto składnia polecenia dlsym ():

#włączać
# void *dlsym (void *__ ogranicznika____, const char *__ ograniczanie____ symbol_name);

Plik nagłówka, w którym definiowana jest funkcja dlsym () . „Symbol_name” to ciąg znaków, który jest reprezentacją nazwy symbolu, a „Handler” to wartość uzyskana przez wywołanie do dlopen () (który nie został jeszcze zwrócony na żądanie do dlclose ()).

Wartość zerowa jest zwracana, jeśli uchwyt nie wskazuje na odpowiedni DLL, który został otwarty przez Dlopen (). Wartość zerowa jest zwracana przez funkcję DLSym (), jeśli żadna DLL połączona z obsługą pasuje do nazwanego symbolu (nazwa symboli).

Utwórz DLSYM.plik C za pomocą edytora vim lub dowolnego wybranego edytora, który może obejmować nano itp.

Napisz kod podany na poniższym ekranie do pliku C utworzonego w poprzednim kroku. Pliki nagłówka są zawarte w pierwszych czterech wierszach kodu w poniższym kodzie przykładowym. Następnie uruchamiana jest główna funkcja i w ramach głównej funkcji tworzony wskaźnik obsługi typu pustki. Poprzednia wiersz kodu deklaruje wskaźnik kodowany znak.

Za pomocą tego wywołaliśmy metodę Dlopen i dostarczyliśmy leniwą flagę RTLD wraz z lokalizacją .więc plik (który jest dynamicznym plik udostępnionym w Linux). Zmienna obsługi utrzyma wyniki dlopen. Zwracając 1, następny wiersz określa, czy DLOPEN z powodzeniem załadował bibliotekę dynamicznych linków. W przypadku awarii błąd został zapisany na ekranie, a główna funkcja została zakończona.

Po wyrażeniu warunkowym nazywamy teraz metodą dLerror (), aby naprawić istniejący błąd. Gdy tylko dodamy 1 liczbę całkowitą ASCII do zakodowanego symbolu typu postaci, który zdefiniowaliśmy, będzie miała wartość „Puts.„Długość łańcucha została obliczona w następnym wierszu i zapisano w zakodowanej zmiennej długości, która następnie zastosowano w pętli dla do dekodowania. Używamy symbolu końcowego „0”, aby zakończyć kod po pętli dla. Następnie wykonaliśmy metodę dlsym (), przekazując parametry modułu obsługi i dekodowanego kodu, a zmienna wyjściowa obejmowała wyniki.

Podczas wywoływania funkcji DLSym () do kompilacji pliku C, proces kompilacji w kompilatorze C różni się od standardowego polecenia kompilacji. Utworzysz program za pomocą następującego polecenia, gdyby znajdował się w pliku o nazwie „DLSYM.C":

$ gcc -rdynamic -o foo dlsym.C -ldl

Po udanej kompilacji plik wyjściowy jest tworzony i nadaje nazwę DLSYM.na zewnątrz. Po prostu wprowadź polecenie./DLSYM.i naciśnij klawisz Enter, aby uruchomić plik wyjściowy. Wyjście pliku będzie wyświetlane na ekranie terminalu w systemie operacyjnym podobnym do UNIX lub LINUX.

Korzystając z edytora VIM, dokonaliśmy niewielkiej regulacji do ostatnich wierszy kodów pliku C. Instrukcja drukowania na końcu funkcji głównej musi być zastąpiona wyjściem, który został przekształcony w funkcję Puts. W podwójnych cechach ekranu tekst został dodany.

Teraz ponownie skompiluj kod i zobacz wyjście na ekranie terminalu; Bez korzystania z instrukcji drukowania otrzymujemy dane wyjściowe na ekranie za pomocą naszej wartości wyjściowej, która została zmieniona na funkcję Puts. Oto wyjście tego konkretnego pliku kodu pokazanego powyżej.

Wniosek

W akapicie wprowadzającym tego artykułu omówiliśmy zastosowanie funkcji DLSym () 3 C, aby znaleźć adres określonego określonego symbolu w DLL. Omówiliśmy i opracowaliśmy dwa wyraźne przykłady C w systemie operacyjnym Kali Linux. Oba przykłady są bardzo proste, ale bardzo wydajne jednocześnie i pokazują wykorzystanie funkcji DLSYM (.