Linux dlopen -system i C

Linux dlopen -system i C
Bibliotekfunksjonen dlopen () er en veldig nyttig funksjon i C -språket. Funksjonen laster biblioteket inn i minnet etter å ha åpnet en ny. Vi bruker den vanligvis til å laste biblioteksymbolene som er ukjente på kompileringstidspunktet. Dlopen () er en funksjon som brukes i programmene våre. DL -biblioteket implementerer dlopen (), definert i DLFCN.h. Det kreves to parametere for DLOpen -funksjonen: Navnet på bibliotekfilen og flagget. Filens navn er et dynamisk bibliotek, og den definerer om bibliotekets avhengigheter blir beregnet med en gang eller ikke. Dlopen () returnerer et "håndtak" som bør betraktes som en ugjennomsiktig verdi og andre DL -bibliotekoperasjoner bruker dette. Hvis forsøket på å laste er mislykket, returnerer dlopen () null. Men dlopen () returnerer det samme filhåndtaket hvis det laster det samme biblioteket mange ganger.

Mens du bruker DLOpen -funksjonen, undersøker ikke kompilatoren for potensielle feil, siden den ikke er klar over typene og prototypene vi bruker. Distribusjonen av DLOpen -funksjonen for standardbelastning ser ikke ut til å bli fremmet av den, bortsett fra noen få mindre situasjoner. Forresten, det er en tilnærming for å forbedre introspeksjonen. Når den delte modulen for øyeblikket brukes av et annet program, er ikke minnelayoutoptimaliseringen spesielt interessert i betinget belastning. Minnefotavtrykket øker ikke når et tidligere brukt bibliotek lastes. Å unngå kompilatorovervåking er farlig og gir god feilskriving. I tillegg mangler vi mulig kompilatoroptimalisering.

Eksempel 1:

Tenk nå på følgende eksempel for å se funksjonaliteten til DLOpen -funksjonen på C -språket. I det første trinnet laster vi noen C -standardbiblioteker. Her laster vi det nye biblioteket “DLFCN.H ”som brukes til å definere makroene mens du konstruerer DLOpen -modus -argumentet.

Deretter introduserer vi et annet bibliotek i programmet vårt “GNU/lib-name.h ”. De delte bibliotekfilene som er inkludert i GNU LIBC, finnes av brukerprogrammene i henhold til makroene som de definerer. GNU C-biblioteket tilbyr de grunnleggende bibliotekene for GNU- og GNU/Linux-operativsystemene, samt et bredt spekter av andre Linux-baserte systemer. Etter det har vi den viktigste metoden implementering. Inne i det erklærer vi at pekerobjektet "håndterer" med tomt nøkkelordet. Vi erklærer en peker sinusfunksjon som har datatypen dobbelt. Det er en annen erklæring om pekerobjektet "feil" for feilhåndtering.

Etter det påkaller vi dlopen -funksjonen inne i "håndtaket" -objektet. DLOPEN tar to argumenter: libm_so og "rtld_lazy". Her er "libm_so" navnet på bibliotekfilen som gir matematiske funksjoner som trigonometriske funksjoner. Dette delte biblioteket er påkrevd når vi bruker sinusfunksjonen. "RTLD_LAZY" er et annet argument som kaller DLOPEN -funksjonen. Når et gitt symbol refereres til første gang, må flytting utføres om gangen bestemt av implementeringen.

Siden en prosess kanskje ikke refererer til hvert symbol i en kjørbar objektfil, bør spesifisering av RTLD Lazy forbedre ytelsen på implementeringer som muliggjør det dynamiske symbolbindingen. Deretter har vi en IF-est. Vi ringer Dlerror for å fjerne feilen.

Dlerror () -funksjonen gir en null-terminert streng som er menneskelig lesbar og spesifiserer rapportering av den nylige feilen som er forårsaket av en samtale til en av DLOpen API-anropene siden forrige Dlerror-samtale. Deretter kaster vi funksjonen slik: “(*void **) (& Sine) = dlsym (Handle, Sin)”. Siden dette er rart, samsvarer casting med ISO C som unngår advarsler fra kompilatoren. Vi bruker DLSym -funksjonen som får banen til et symbol som er spesifisert i en dynamisk koblingsmodul som er tilgjengelig via en DLOpen () -funksjon.

Vi utfører også IF-elves operasjonen for standardfeilen som genereres når Dlerror () ikke er null. Deretter har vi en Printf -setning der vi spesifiserer sinusverdien som skal beregnes. I det siste trinnet lukker vi det delte objektet ved å påkalle DLClose for håndtaket som er returnert av DLOpen ().

#inkludere
#inkludere
#inkludere
#inkludere
int
Main (Int Argc, Char ** Argv)

tomrom *håndtak;
dobbelt (*sinus) (dobbel);
char *feil;
håndtak = dlopen (libm_so, rtld_lazy);
hvis (!håndtak)
fprintf (stderr, "%s \ n", dlerror ());
exit (exit_failure);

dlerror ();
*(void **) (& sinus) = dlsym (håndtak, "sin");
if ((feil = dlerror ()) != Null)
fprintf (stderr, "%s \ n", feil);
exit (exit_failure);

printf ("%f \ n", (*sinus) (4.0));
dlClose (håndtak);
exit (exit_success);

Vi bruker alternativet -LDL med C Compilation Command, siden dette er biblioteket for DLOpen -koblede grensesnitt, og det er påkrevd. Når utførelsen av DLOpen-filen er laget, viser den sinusverdien til den tidligere gitt verdien.

Eksempel 2:

Nå tar vi et annet eksempel på å bruke dlopen -funksjonen. Vi laster inn programmet vårt med alle nødvendige C -biblioteker for implementering av DLOPEN -koden. Deretter starter vi programmet vårt i hovedmetoden. Her definerer vi strengen med erklæringen om variabelen “SRC”. Vi erklærer da pekervariablene "Strlen", "Håndtak" og "Feil".

Deretter kaller vi håndtaksvariabelen og distribuerer DLOPEN -funksjonen. DLOPEN -funksjonen legger inn det delte biblioteket “libstr.Så ”for strenghåndteringsfunksjoner og flagget“ rtld_lazy ”som allerede er demonstrert i forrige eksempel. Vi påkaller Dlerror -funksjonen i "feilen" -variabelen for å fjerne feilen generert av DLOpen -funksjonen. IF-Else brukes til å undersøke feilene.

Deretter oppnår vi Strlen -funksjonens adresse ved hjelp av DLSym -funksjonen og verifiser feilene mens vi gjør dette. Etter dette bruker vi printf -funksjonen for å ringe strnlen -funksjonen for å returnere lengden på den gitte strengen. Til slutt lukker vi det delte biblioteket med dlclose -funksjonen.

#inkludere
#inkludere
#inkludere
#inkludere
Int Main (Void)

char* src = "hallo linux";
int ( *strlen) (const char *);
tomrom *håndtak;
char *feil;
håndtak = dlopen ("./libstr.så ", rtld_lazy);
feil = dlerror ();
hvis(!håndtak || feil != Null) printf ("Lasting bibliotekforsøk mislyktes!\ n%s \ n ", feil);
return -1;
strlen = dlsym (håndtak, "strlen");
feil = dlerror ();
hvis(!strlen || feil == null) printf ("%s \ n", feil); retur -1;
printf ("lengden på strengen er:%d \ n", strlen (src));
dlClose (håndtak);
retur 0;

Vi bruker følgende kommando for utførelse av det gitte programmet. Her brukes -LSTR -flagget for strenglengdefunksjonen, og LDL brukes til DLOPEN -bibliotekfilen. Det kompilerte programmet gir lengden på strengen som vist i skallet:

Konklusjon

Informasjonen gis om DLOpen -funksjonen til C -språket i denne artikkelen. Vi har en kort introduksjon av dlopen -funksjonen. Deretter implementerte vi to eksempler. Funksjonen returnerer en identifikator som definerer det åpne biblioteket. Adressene til funksjonene inne i det åpne biblioteket blir deretter bestemt ved hjelp av denne identifikatoren og DLSym -funksjonen. En funksjons adresse i et bibliotek som allerede er åpnet ved hjelp av DLOpen, finner du ved hjelp av DLSym -funksjonen.