Sistem Linux Dlopen v C

Sistem Linux Dlopen V C



Knjižnična funkcija dlopen() je zelo uporabna funkcija v jeziku C. Funkcija naloži knjižnico v pomnilnik po odprtju nove. Na splošno ga uporabljamo za nalaganje knjižničnih simbolov, ki v času prevajanja niso znani. Dlopen() je funkcija, ki se uporablja v naših programih. Knjižnica DL implementira dlopen(), definirano v Dlfcn.h. Za funkcijo dlopen sta potrebna dva parametra: ime datoteke knjižnice in zastavica. Ime datoteke je dinamična knjižnica in določa, ali se odvisnosti knjižnice izračunajo takoj ali ne. dlopen() vrne 'ročaj', ki ga je treba obravnavati kot neprozorno vrednost in druge operacije knjižnice DL to uporabljajo. Če je poskus nalaganja neuspešen, dlopen() vrne NULL. Toda dlopen() vrne isti ročaj datoteke, če večkrat naloži isto knjižnico.

Med uporabo funkcije dlopen prevajalnik ne preverja morebitnih napak, saj ne pozna vrst in prototipov, ki jih uporabljamo. Zdi se, da ne spodbuja uvedbe funkcije dlopen za standardno nalaganje, razen v nekaj manjših primerih. Mimogrede, to je pristop za izboljšanje introspekcije. Ko modul v skupni rabi trenutno uporablja drug program, optimizacija postavitve pomnilnika ni posebej zainteresirana za pogojno nalaganje. Pomnilniški odtis se ne poveča, ko se naloži prej uporabljena knjižnica. Izogibanje spremljanju prevajalnika je nevarno in omogoča dobro pisanje napak. Poleg tega nam manjka možna optimizacija prevajalnika.

Primer 1:

Zdaj si oglejte naslednji primer, da si ogledate funkcionalnost funkcije dlopen v jeziku C. V prvem koraku naložimo nekaj standardnih knjižnic C. Tukaj naložimo novo knjižnico 'dlfcn.h', ki se uporablja za definiranje makrov med konstruiranjem argumenta načina dlopen.







Nato v naš program uvedemo še eno knjižnico »gnu/lib-name.h«. Datoteke knjižnice v skupni rabi, vključene v GNU libc, najdejo uporabniški programi glede na makre, ki jih definira. Knjižnica GNU C ponuja temeljne knjižnice za operacijska sistema GNU in GNU/Linux kot tudi široko paleto drugih sistemov, ki temeljijo na Linuxu. Po tem imamo izvedbo glavne metode. Znotraj tega razglasimo objekt kazalca 'handle' s ključno besedo void. Deklariramo sinusno funkcijo kazalca, ki ima podatkovni tip double. Obstaja še ena deklaracija kazalnega objekta 'error' za obravnavanje napak.



Po tem prikličemo funkcijo dlopen znotraj predmeta »handle«. Dlopen sprejme dva argumenta: LIBM_SO in “RTLD_LAZY”. Tu je »LIBM_SO« ime knjižnične datoteke, ki zagotavlja matematične funkcije, kot so trigonometrične funkcije. Ta skupna knjižnica je potrebna, ker uporabljamo sinusno funkcijo. »RTLD_LAZY« je še en argument, ki kliče funkcijo dlopen. Ko se dani simbol sklicuje prvič, je treba premestitve izvesti ob času, ki ga določi implementacija.



Ker se proces morda ne bo skliceval na vse simbole v izvedljivi objektni datoteki, mora podajanje RTLD LAZY izboljšati zmogljivost implementacij, ki omogočajo dinamično vezavo simbolov. Nato imamo pogoj if-else za obravnavo napak, ko predmet ročaja ne izvede funkcije dlopen. Pokličemo dlerror, da počistimo napako.





Funkcija dlerror() zagotavlja niz z ničelnim zaključkom, ki je berljiv in določa poročanje o nedavni napaki, ki jo povzroči klic enega od klicev dlopen API od zadnjega klica dlerror. Nato funkcijo pretvorimo takole: '(*void**)(&sine)= dlsym(handle, sin)'. Ker je to nenavadno, je pretvorba v skladu z ISO C, ki se izogiba opozorilom prevajalnika. Uporabljamo funkcijo dlsym, ki pridobi pot simbola, določenega znotraj modula dinamične povezave, ki je dostopen prek funkcije dlopen().

Prav tako znova izvedemo operacijo if-else za standardno napako, ki se ustvari, ko dlerror() ni NULL. Nato imamo stavek printf, kjer določimo vrednost sinusa, ki naj se izračuna. V zadnjem koraku zapremo ta objekt v skupni rabi s klicem dlclose za ročaj, ki ga vrne dlopen().



#include
#include
#include
#include

int
glavni ( int argc , char ** argv )
{
praznina * ročaj ;
dvojno ( * njihov ) ( dvojno ) ;
char * napaka ;

ročaj = dlopen ( LIBM_SO , RTLD_LENI ) ;
če ( ! ročaj ) {
fprintf ( stderr , '%s \n ' , dlerror ( ) ) ;
izhod ( EXIT_FAILURE ) ;
}
dlerror ( ) ;

* ( praznina ** ) ( & njihov ) = dlsym ( ročaj , 'brez' ) ;

če ( ( napaka = dlerror ( ) ) != NIČ ) {
fprintf ( stderr , '%s \n ' , napaka ) ;
izhod ( EXIT_FAILURE ) ;
}

printf ( '%f \n ' , ( * njihov ) ( 4.0 ) ) ;
dlclose ( ročaj ) ;
izhod ( IZHOD_USPEH ) ;
}

Z ukazom za prevajanje C uporabljamo možnost -ldl, ker je to knjižnica za povezani vmesnik dlopen in je obvezna. Ko se datoteka dlopen izvede, prikaže sinusno vrednost predhodno podane vrednosti.

Primer 2:

Zdaj pa vzamemo še en primer uporabe funkcije dlopen. Naš program naložimo z vsemi potrebnimi knjižnicami C za implementacijo kode dlopen. Nato zaženemo naš program znotraj glavne metode. Tukaj definiramo niz z deklaracijo spremenljivke “src”. Nato deklariramo spremenljivke kazalca 'strlen', 'handle' in 'error'.

Nato pokličemo spremenljivko ročaja in razmestimo funkcijo dlopen. Funkcija dlopen vnese knjižnico v skupni rabi »libstr.so« za funkcije za ravnanje z nizi in zastavico »RTLD_LAZY«, ki je že prikazana v prejšnjem primeru. Prikličemo funkcijo dlerror znotraj spremenljivke »error«, da počistimo napako, ki jo ustvari funkcija dlopen. Za preverjanje napak se uporablja if-else.

Nato pridobimo naslov funkcije strlen s funkcijo dlsym in med tem preverimo napake. Po tem uporabimo funkcijo printf za klic funkcije strnlen za vrnitev dolžine danega niza. Na koncu deljeno knjižnico zapremo s funkcijo dlclose.

#include
#include
#include
#include
int glavni ( praznina )
{
char * src = 'Pozdravljen Linux' ;
int ( * strlen ) ( konst char * ) ;
praznina * ročaj ;
char * napaka ;


ročaj = dlopen ( './libstr.so' , RTLD_LENI ) ;
napaka = dlerror ( ) ;
če ( ! ročaj || napaka != NIČ ) { printf ( »Poskus nalaganja knjižnice ni uspel! \n %s \n ' , napaka ) ;
vrnitev - 1 ; }

strlen = dlsym ( ročaj , 'strlen' ) ;
napaka = dlerror ( ) ;
če ( ! strlen || napaka == NIČ ) { printf ( '%s \n ' , napaka ) ; vrnitev - 1 ; }

printf ( 'Dolžina niza je:%d \n ' , strlen ( src ) ) ;
dlclose ( ročaj ) ;
vrnitev 0 ;
}

Za izvajanje danega programa uporabimo naslednji ukaz. Tu se zastavica -lstr uporablja za funkcijo dolžine niza, ldl pa za datoteko knjižnice dlopen. Prevedeni program poda dolžino niza, kot je prikazano v lupini:

Zaključek

V tem članku so podane informacije o funkciji dlopen jezika C. Imamo kratko predstavitev funkcije dlopen. Nato smo implementirali dva primera. Funkcija vrne identifikator, ki definira odprto knjižnico. Naslovi funkcij znotraj odprte knjižnice se nato določijo z uporabo tega identifikatorja in funkcije dlsym. Naslov funkcije v knjižnici, ki je že bila odprta z dlopen, je mogoče najti s funkcijo dlsym.