Linux Dlopen sustav u C

Linux Dlopen Sustav U C



Funkcija biblioteke dlopen() vrlo je korisna funkcija u jeziku C. Funkcija učitava biblioteku u memoriju nakon otvaranja nove. Općenito ga koristimo za učitavanje simbola knjižnice koji su nepoznati u vrijeme kompajliranja. Dlopen() je funkcija koja se koristi u našim programima. DL biblioteka implementira dlopen(), definiran u Dlfcn.h. Za funkciju dlopen potrebna su dva parametra: naziv datoteke knjižnice i zastavica. Naziv datoteke je dinamička biblioteka i definira hoće li se ovisnosti biblioteke odmah izračunati ili ne. Dlopen() vraća 'ručicu' koju treba smatrati neprozirnom vrijednošću i druge operacije DL knjižnice to koriste. Ako je pokušaj učitavanja neuspješan, dlopen() vraća NULL. Ali dlopen() vraća isti rukovatelj datotekom ako učitava istu knjižnicu mnogo puta.

Dok koristi funkciju dlopen, prevodilac ne ispituje moguće pogreške budući da nije svjestan tipova i prototipova koje koristimo. Čini se da se ne promiče implementacija funkcije dlopen za standardno učitavanje, osim u nekoliko manjih situacija. Usput, to je pristup poboljšanju introspekcije. Kada zajednički modul trenutno koristi drugi program, optimizacija rasporeda memorije nije posebno zainteresirana za uvjetno učitavanje. Memorijski otisak se ne povećava kada se učita prethodno korištena biblioteka. Izbjegavanje nadgledanja kompajlera je opasno i omogućuje dobro pisanje grešaka. Osim toga, nedostaje nam moguća optimizacija prevoditelja.

Primjer 1:

Sada razmotrite sljedeći primjer kako biste vidjeli funkcionalnost funkcije dlopen u jeziku C. U prvom koraku učitavamo neke C standardne biblioteke. Ovdje učitavamo novu biblioteku “dlfcn.h” koja se koristi za definiranje makronaredbi tijekom konstruiranja argumenta načina dlopen.







Zatim uvodimo drugu biblioteku unutar našeg programa “gnu/lib-name.h”. Datoteke dijeljene biblioteke uključene u GNU libc pronalaze korisnički programi prema makronaredbama koje on definira. GNU C knjižnica nudi temeljne biblioteke za GNU i GNU/Linux operativne sustave kao i širok raspon drugih sustava baziranih na Linuxu. Nakon toga imamo implementaciju glavne metode. Unutar toga, objekt pokazivača deklariramo 'handle' s ključnom riječi void. Deklariramo pokazivačku sinusnu funkciju koja ima tip podataka double. Postoji još jedna deklaracija objekta pokazivača 'greška' za obradu grešaka.



Nakon toga pozivamo funkciju dlopen unutar objekta “ručica”. Dlopen uzima dva argumenta: LIBM_SO i “RTLD_LAZY”. Ovdje je 'LIBM_SO' naziv datoteke biblioteke koja pruža matematičke funkcije poput trigonometrijskih funkcija. Ova dijeljena biblioteka je potrebna jer koristimo sinusnu funkciju. “RTLD_LAZY” je još jedan argument koji poziva funkciju dlopen. Kada se dati simbol referencira prvi put, premještanja se moraju izvršiti u vrijeme određeno implementacijom.



Budući da proces možda neće referencirati svaki simbol u izvršnoj objektnoj datoteci, specificiranje RTLD LAZY trebalo bi poboljšati performanse na implementacijama koje omogućuju dinamičko vezanje simbola. Sljedeće, imamo if-else uvjet za rukovanje pogreškom kada objekt handle ne uspije izvršiti funkciju dlopen. Pozivamo dlerror da obrišemo grešku.





Funkcija dlerror() pruža null-terminirani niz koji je čitljiv i specificira izvješćivanje o nedavnoj pogrešci koja je uzrokovana pozivom jednog od dlopen API poziva od posljednjeg dlerror poziva. Zatim, pretvaramo funkciju ovako: “(*void**)(&sine)= dlsym(ručka, sin)”. Budući da je ovo čudno, kasting je u skladu s ISO C koji izbjegava upozorenja prevoditelja. Koristimo funkciju dlsym koja dobiva putanju simbola koji je naveden unutar modula dinamičke veze kojemu se može pristupiti putem funkcije dlopen().

Također, ponovno izvodimo operaciju if-else za standardnu ​​pogrešku koja se generira kada dlerror() nije NULL. Zatim imamo naredbu printf gdje specificiramo sinusnu vrijednost koju treba izračunati. U posljednjem koraku zatvaramo taj zajednički objekt pozivanjem dlclose za ručku koju vraća dlopen().



#include
#include
#include
#include

int
glavni ( int argc , char ** argv )
{
poništiti * drška ;
dvostruko ( * njihov ) ( dvostruko ) ;
char * greška ;

drška = dlopen ( LIBM_SO , RTLD_LJEN ) ;
ako ( ! drška ) {
fprintf ( stderr , '%s \n ' , dlerror ( ) ) ;
Izlaz ( EXIT_FAILURE ) ;
}
dlerror ( ) ;

* ( poništiti ** ) ( i njihov ) = dlsym ( drška , 'bez' ) ;

ako ( ( greška = dlerror ( ) ) != NULL ) {
fprintf ( stderr , '%s \n ' , greška ) ;
Izlaz ( EXIT_FAILURE ) ;
}

printf ( '%f \n ' , ( * njihov ) ( 4.0 ) ) ;
dlclose ( drška ) ;
Izlaz ( IZLAZ_USPJEH ) ;
}

Koristimo opciju -ldl s naredbom C kompilacije jer je ovo biblioteka za dlopen povezano sučelje i potrebna je. Kada se izvrši izvođenje dlopen datoteke, ona prikazuje sinusnu vrijednost prethodno dane vrijednosti.

Primjer 2:

Sada ćemo uzeti još jedan primjer korištenja funkcije dlopen. Naš program učitavamo sa svim potrebnim C bibliotekama za implementaciju dlopen koda. Zatim pokrećemo naš program unutar glavne metode. Ovdje definiramo niz s deklaracijom varijable “src”. Zatim deklariramo varijable pokazivača “strlen”, “handle” i “error”.

Zatim pozivamo varijablu handle i implementiramo funkciju dlopen. Funkcija dlopen unosi dijeljenu biblioteku “libstr.so” za funkcije rukovanja nizovima i zastavu “RTLD_LAZY” što je već prikazano u prethodnom primjeru. Pozivamo funkciju dlerror unutar varijable 'error' da obrišemo pogrešku koju je generirala funkcija dlopen. If-else se koristi za ispitivanje pogrešaka.

Zatim dobivamo adresu funkcije strlen pomoću funkcije dlsym i provjeravamo pogreške dok to radimo. Nakon toga koristimo funkciju printf za pozivanje funkcije strnlen za vraćanje duljine zadanog niza. Na kraju zatvaramo dijeljenu biblioteku funkcijom dlclose.

#include
#include
#include
#include
int glavni ( poništiti )
{
char * src = 'Zdravo Linux' ;
int ( * strlen ) ( konst char * ) ;
poništiti * drška ;
char * greška ;


drška = dlopen ( './libstr.so' , RTLD_LJEN ) ;
greška = dlerror ( ) ;
ako ( ! drška || greška != NULL ) { printf ( 'Pokušaj učitavanja biblioteke nije uspio! \n %s \n ' , greška ) ;
povratak - 1 ; }

strlen = dlsym ( drška , 'strlen' ) ;
greška = dlerror ( ) ;
ako ( ! strlen || greška == NULL ) { printf ( '%s \n ' , greška ) ; povratak - 1 ; }

printf ( 'Duljina niza je:%d \n ' , strlen ( src ) ) ;
dlclose ( drška ) ;
povratak 0 ;
}

Za izvođenje zadanog programa koristimo sljedeću naredbu. Ovdje se oznaka -lstr koristi za funkciju duljine niza, a ldl se koristi za datoteku knjižnice dlopen. Prevedeni program daje duljinu niza kao što je prikazano u ljusci:

Zaključak

Informacije o dlopen funkciji jezika C dane su u ovom članku. Imamo kratki uvod u funkciju dlopen. Zatim smo implementirali dva primjera. Funkcija vraća identifikator koji definira otvorenu biblioteku. Adrese funkcija unutar otvorene biblioteke zatim se određuju pomoću ovog identifikatora i funkcije dlsym. Adresa funkcije unutar biblioteke koja je već otvorena pomoću dlopen može se pronaći pomoću funkcije dlsym.