Linux Dlopen System v C

Linux Dlopen System V C



Knihovní funkce dlopen() je velmi užitečná funkce v jazyce C. Funkce načte knihovnu do paměti po otevření nové. Obecně jej používáme k načtení symbolů knihovny, které jsou v době kompilace neznámé. Dlopen() je funkce, která se používá v našich programech. Knihovna DL implementuje dlopen(), definovanou v Dlfcn.h. Funkce dlopen vyžaduje dva parametry: název souboru knihovny a příznak. Název souboru je dynamická knihovna a určuje, zda se závislosti knihovny vypočítávají okamžitě. Funkce dlopen() vrací „handle“, který by měl být považován za neprůhlednou hodnotu a ostatní operace knihovny DL to používají. Pokud je pokus o načtení neúspěšný, dlopen() vrátí hodnotu NULL. Ale dlopen() vrátí stejný popisovač souboru, pokud mnohokrát načte stejnou knihovnu.

Při použití funkce dlopen kompilátor nezkoumá potenciální chyby, protože si není vědom typů a prototypů, které používáme. Zdá se, že nasazení funkce dlopen pro standardní načítání jí až na pár drobných situací nepropaguje. Mimochodem, je to přístup ke zlepšení introspekce. Když je sdílený modul aktuálně využíván jiným programem, optimalizace rozvržení paměti se nijak zvlášť nezajímá o podmíněné načítání. Paměťová náročnost se nezvýší, když je načtena dříve použitá knihovna. Vyhýbání se monitorování kompilátoru je nebezpečné a přispívá k dobrému psaní chyb. Navíc nám chybí možná optimalizace kompilátoru.

Příklad 1:

Nyní zvažte následující příklad, abyste viděli funkčnost funkce dlopen v jazyce C. V prvním kroku načteme některé standardní knihovny C. Zde načteme novou knihovnu „dlfcn.h“, která se používá k definování maker při vytváření argumentu režimu dlopen.







Poté představíme další knihovnu v našem programu „gnu/lib-name.h“. Soubory sdílené knihovny obsažené v GNU libc najdou uživatelské programy podle maker, která definuje. Knihovna GNU C nabízí základní knihovny pro operační systémy GNU a GNU/Linux a také širokou škálu dalších systémů založených na Linuxu. Poté máme implementaci hlavní metody. Uvnitř deklarujeme objekt ukazatele „handle“ s klíčovým slovem void. Deklarujeme funkci ukazatel sinus, která má datový typ double. Existuje další deklarace objektu ukazatele „chyba“ pro zpracování chyb.



Poté vyvoláme funkci dlopen uvnitř objektu „handle“. Dlopen používá dva argumenty: LIBM_SO a „RTLD_LAZY“. Zde je „LIBM_SO“ název souboru knihovny, který poskytuje matematické funkce, jako jsou goniometrické funkce. Tato sdílená knihovna je vyžadována, protože používáme funkci sinus. „RTLD_LAZY“ je další argument, který volá funkci dlopen. Když se na daný symbol odkazuje poprvé, přemístění musí být provedeno v čase určeném implementací.



Vzhledem k tomu, že proces nemusí odkazovat na každý symbol ve spustitelném objektovém souboru, mělo by zadání RTLD LAZY zvýšit výkon implementací, které umožňují dynamickou vazbu symbolů. Dále máme podmínku if-else pro zpracování chyb, když objekt handle nedokáže provést funkci dlopen. Chybu vymažeme voláním dlerror.





Funkce dlerror() poskytuje řetězec zakončený nulou, který je čitelný pro člověka a určuje hlášení nedávné chyby, která je způsobena voláním jednoho z volání dlopen API od posledního volání dlerror. Poté funkci přetypujeme takto: „(*void**)(&sine)= dlsym(handle, sin)“. Protože je to zvláštní, casting je v souladu s ISO C, což zabraňuje varování kompilátoru. Používáme funkci dlsym, která získá cestu k symbolu, který je zadán uvnitř modulu dynamického odkazu, který je přístupný pomocí funkce dlopen().

Také provedeme operaci if-else znovu pro standardní chybu, která se vygeneruje, když dlerror() není NULL. Pak máme příkaz printf, kde zadáme hodnotu sinus, která se má vypočítat. V posledním kroku zavřeme sdílený objekt vyvoláním dlclose pro handle vrácený dlopen().



#include
#include
#include
#include

int
hlavní ( int argc , char ** argv )
{
prázdnota * Rukojeť ;
dvojnásobek ( * jejich ) ( dvojnásobek ) ;
char * chyba ;

Rukojeť = dlopen ( LIBM_SO , RTLD_LAZY ) ;
-li ( ! Rukojeť ) {
fprintf ( stderr , '%s \n ' , dlerror ( ) ) ;
výstup ( EXIT_FAILURE ) ;
}
dlerror ( ) ;

* ( prázdnota ** ) ( & jejich ) = dlsym ( Rukojeť , 'bez' ) ;

-li ( ( chyba = dlerror ( ) ) != NULA ) {
fprintf ( stderr , '%s \n ' , chyba ) ;
výstup ( EXIT_FAILURE ) ;
}

printf ( '%F \n ' , ( * jejich ) ( 4,0 ) ) ;
dlzavřít ( Rukojeť ) ;
výstup ( EXIT_SUCCESS ) ;
}

Volbu -ldl používáme s příkazem kompilace C, protože se jedná o knihovnu pro propojené rozhraní dlopen a je vyžadována. Po provedení souboru dlopen se zobrazí sinusová hodnota dříve zadané hodnoty.

Příklad 2:

Nyní si vezmeme další příklad použití funkce dlopen. Nahrajeme náš program se všemi požadovanými C knihovnami pro implementaci dlopen kódu. Poté spustíme náš program uvnitř hlavní metody. Zde definujeme řetězec s deklarací proměnné „src“. Poté deklarujeme proměnné ukazatele „strlen“, „handle“ a „error“.

Dále zavoláme proměnnou handle a nasadíme funkci dlopen. Funkce dlopen vloží sdílenou knihovnu „libstr.so“ pro funkce zpracování řetězců a příznak „RTLD_LAZY“, který je již demonstrován v předchozím příkladu. Vyvoláme funkci dlerror uvnitř proměnné „error“, abychom vymazali chybu generovanou funkcí dlopen. Ke zkoumání chyb se používá if-else.

Poté získáme adresu funkce strlen pomocí funkce dlsym a ověříme chyby. Poté pomocí funkce printf zavoláme funkci strnlen, která vrátí délku daného řetězce. Na závěr sdílenou knihovnu zavřeme funkcí dlclose.

#include
#include
#include
#include
int hlavní ( prázdnota )
{
char * src = 'Ahoj Linux' ;
int ( * strlen ) ( konst char * ) ;
prázdnota * Rukojeť ;
char * chyba ;


Rukojeť = dlopen ( './libstr.so' , RTLD_LAZY ) ;
chyba = dlerror ( ) ;
-li ( ! Rukojeť || chyba != NULA ) { printf ( 'Pokus o načtení knihovny se nezdařil! \n %s \n ' , chyba ) ;
vrátit se - 1 ; }

strlen = dlsym ( Rukojeť , 'strlen' ) ;
chyba = dlerror ( ) ;
-li ( ! strlen || chyba == NULA ) { printf ( '%s \n ' , chyba ) ; vrátit se - 1 ; }

printf ( 'Délka řetězce je:%d.' \n ' , strlen ( src ) ) ;
dlzavřít ( Rukojeť ) ;
vrátit se 0 ;
}

Pro provedení daného programu použijeme následující příkaz. Zde je parametr -lstr použit pro funkci délky řetězce a ldl se používá pro soubor knihovny dlopen. Zkompilovaný program udává délku řetězce, jak je znázorněno v shellu:

Závěr

Informace týkající se funkce dlopen jazyka C jsou uvedeny v tomto článku. Máme zde krátké představení funkce dlopen. Poté jsme implementovali dva příklady. Funkce vrací identifikátor, který definuje otevřenou knihovnu. Adresy funkcí v otevřené knihovně jsou pak určeny pomocí tohoto identifikátoru a funkce dlsym. Adresu funkce v knihovně, která již byla otevřena pomocí dlopen, lze nalézt pomocí funkce dlsym.