Linux Dlopen System v C

Linux Dlopen System V C



Knižničná funkcia dlopen() je veľmi užitočná funkcia v jazyku C. Funkcia načíta knižnicu do pamäte po otvorení novej. Vo všeobecnosti ho používame na načítanie symbolov knižnice, ktoré sú neznáme v čase kompilácie. Dlopen() je funkcia, ktorá sa používa v našich programoch. Knižnica DL implementuje dlopen(), definované v Dlfcn.h. Pre funkciu dlopen sú potrebné dva parametre: názov súboru knižnice a príznak. Názov súboru je dynamická knižnica a definuje, či sa závislosti knižnice počítajú okamžite alebo nie. Dlopen() vracia „handle“, ktorý by sa mal považovať za nepriehľadnú hodnotu a ostatné operácie knižnice DL to používajú. Ak je pokus o načítanie neúspešný, funkcia dlopen() vráti hodnotu NULL. Ale dlopen() vráti rovnaký popisovač súboru, ak mnohokrát načíta rovnakú knižnicu.

Pri používaní funkcie dlopen kompilátor neskúma potenciálne chyby, pretože nepozná typy a prototypy, ktoré používame. Zdá sa, že nasadenie funkcie dlopen pre štandardné načítavanie až na pár drobných situácií nepropaguje. Mimochodom, je to prístup na zlepšenie introspekcie. Keď je zdieľaný modul v súčasnosti využívaný iným programom, optimalizácia rozloženia pamäte sa zvlášť nezaujíma o podmienené načítanie. Pamäťová stopa sa nezvýši, keď sa načíta predtým použitá knižnica. Vyhýbanie sa monitorovaniu kompilátora je nebezpečné a umožňuje dobré písanie chýb. Okrem toho nám chýba možná optimalizácia kompilátora.

Príklad 1:

Teraz si pozrite nasledujúci príklad, aby ste videli funkčnosť funkcie dlopen v jazyku C. V prvom kroku načítame niektoré štandardné knižnice C. Tu načítame novú knižnicu „dlfcn.h“, ktorá sa používa na definovanie makier pri vytváraní argumentu režimu dlopen.







Potom predstavíme ďalšiu knižnicu v našom programe „gnu/lib-name.h“. Súbory zdieľanej knižnice zahrnuté v GNU libc sú nájdené používateľskými programami podľa makier, ktoré definuje. Knižnica GNU C ponúka základné knižnice pre operačné systémy GNU a GNU/Linux, ako aj širokú škálu iných systémov založených na Linuxe. Potom máme implementáciu hlavnej metódy. Vnútri deklarujeme objekt ukazovateľa „handle“ s kľúčovým slovom void. Deklarujeme funkciu ukazovateľ sínus, ktorá má dátový typ double. Existuje ďalšia deklarácia objektu ukazovateľa „chyba“ na spracovanie chýb.



Potom vo vnútri objektu „handle“ vyvoláme funkciu dlopen. Dlopen má dva argumenty: LIBM_SO a „RTLD_LAZY“. Tu je „LIBM_SO“ názov súboru knižnice, ktorý poskytuje matematické funkcie, ako napríklad goniometrické funkcie. Táto zdieľaná knižnica je potrebná, pretože používame funkciu sínus. „RTLD_LAZY“ je ďalší argument, ktorý volá funkciu dlopen. Keď sa na daný symbol odkazuje prvýkrát, premiestnenia sa musia vykonať v čase určenom implementáciou.



Keďže proces nemusí odkazovať na každý symbol v súbore spustiteľného objektu, špecifikácia RTLD LAZY by mala zvýšiť výkon na implementáciách, ktoré umožňujú dynamické viazanie symbolov. Ďalej máme podmienku if-else na spracovanie chýb, keď objekt handle nedokáže vykonať funkciu dlopen. Na vymazanie chyby voláme dlerror.





Funkcia dlerror() poskytuje reťazec ukončený nulou, ktorý je čitateľný a špecifikuje hlásenie nedávnej chyby spôsobenej volaním jedného z volaní dlopen API od posledného volania dlerror. Potom funkciu pretypujeme takto: „(*void**)(&sine)= dlsym(handle, sin)“. Keďže je to zvláštne, casting je v súlade s normou ISO C, čo zabraňuje varovaniu kompilátora. Používame funkciu dlsym, ktorá získa cestu k symbolu, ktorý je špecifikovaný v module dynamického prepojenia, ktorý je prístupný cez funkciu dlopen().

Tiež vykonáme operáciu if-else znova pre štandardnú chybu, ktorá sa vygeneruje, keď dlerror() nie je NULL. Potom máme príkaz printf, kde špecifikujeme sínusovú hodnotu, ktorá sa má vypočítať. V poslednom kroku zatvoríme zdieľaný objekt vyvolaním dlclose pre handle vrátený dlopen().



#include
#include
#include
#include

int
hlavné ( int argc , char ** argv )
{
neplatné * rukoväť ;
dvojitý ( * ich ) ( dvojitý ) ;
char * chyba ;

rukoväť = dlopen ( LIBM_SO , RTLD_LAZY ) ;
ak ( ! rukoväť ) {
fprintf ( stderr , '%s \n ' , dlerror ( ) ) ;
VÝCHOD ( EXIT_FAILURE ) ;
}
dlerror ( ) ;

* ( neplatné ** ) ( & ich ) = dlsym ( rukoväť , 'bez' ) ;

ak ( ( chyba = dlerror ( ) ) != NULOVÝ ) {
fprintf ( stderr , '%s \n ' , chyba ) ;
VÝCHOD ( EXIT_FAILURE ) ;
}

printf ( '%f \n ' , ( * ich ) ( 4.0 ) ) ;
dlzavrieť ( rukoväť ) ;
VÝCHOD ( EXIT_SUCCESS ) ;
}

Voľbu -ldl používame s príkazom na kompiláciu C, pretože toto je knižnica pre rozhranie spojené s dlopen a je to potrebné. Keď sa vykoná spustenie súboru dlopen, zobrazí sa sínusová hodnota predtým zadanej hodnoty.

Príklad 2:

Teraz si vezmeme ďalší príklad použitia funkcie dlopen. Načítame náš program so všetkými potrebnými knižnicami C na implementáciu kódu dlopen. Potom spustíme náš program v hlavnej metóde. Tu definujeme reťazec s deklaráciou premennej „src“. Potom deklarujeme premenné ukazovateľa „strlen“, „handle“ a „error“.

Ďalej zavoláme premennú handle a nasadíme funkciu dlopen. Funkcia dlopen vloží zdieľanú knižnicu „libstr.so“ pre funkcie spracovania reťazcov a príznak „RTLD_LAZY“, ktorý je už demonštrovaný v predchádzajúcom príklade. Vo vnútri premennej „error“ vyvoláme funkciu dlerror, aby sme vymazali chybu vygenerovanú funkciou dlopen. If-else sa používa na preskúmanie chýb.

Potom získame adresu funkcie strlen pomocou funkcie dlsym a overíme chyby. Potom pomocou funkcie printf zavoláme funkciu strnlen, ktorá vráti dĺžku daného reťazca. Na záver zdieľanú knižnicu zatvoríme funkciou dlclose.

#include
#include
#include
#include
int hlavné ( neplatné )
{
char * src = 'Ahoj Linux' ;
int ( * strlen ) ( konšt char * ) ;
neplatné * rukoväť ;
char * chyba ;


rukoväť = dlopen ( './libstr.so' , RTLD_LAZY ) ;
chyba = dlerror ( ) ;
ak ( ! rukoväť || chyba != NULOVÝ ) { printf ( 'Pokus o načítanie knižnice zlyhal! \n %s \n ' , chyba ) ;
vrátiť - 1 ; }

strlen = dlsym ( rukoväť , 'strlen' ) ;
chyba = dlerror ( ) ;
ak ( ! strlen || chyba == NULOVÝ ) { printf ( '%s \n ' , chyba ) ; vrátiť - 1 ; }

printf ( 'Dĺžka reťazca je: %d \n ' , strlen ( src ) ) ;
dlzavrieť ( rukoväť ) ;
vrátiť 0 ;
}

Na vykonanie daného programu použijeme nasledujúci príkaz. Tu sa príznak -lstr používa pre funkciu dĺžky reťazca a ldl sa používa pre súbor knižnice dlopen. Kompilovaný program udáva dĺžku reťazca, ako je znázornené v shell:

Záver

Informácie týkajúce sa funkcie dlopen jazyka C sú uvedené v tomto článku. Máme tu krátke predstavenie funkcie dlopen. Potom sme implementovali dva príklady. Funkcia vracia identifikátor, ktorý definuje otvorenú knižnicu. Adresy funkcií v otvorenej knižnici sú potom určené pomocou tohto identifikátora a funkcie dlsym. Adresu funkcie v knižnici, ktorá už bola otvorená pomocou dlopen, možno nájsť pomocou funkcie dlsym.