Sistema Dlopen Linux in C

Sistema Dlopen Linux in C
La funzione della libreria dlopen () è una funzione molto utile nella lingua C. La funzione carica la libreria nella memoria dopo averne aperto una nuova. In genere lo usiamo per caricare i simboli della libreria che sono sconosciuti al momento della compilazione. Dlopen () è una funzione utilizzata nei nostri programmi. La libreria DL implementa dlopen (), definita in dlfcn.H. Sono necessari due parametri per la funzione dlopen: il nome del file della libreria e il flag. Il nome del file è una libreria dinamica e definisce se le dipendenze della libreria sono calcolate immediatamente. Il dlopen () restituisce una "maniglia" che dovrebbe essere considerata un valore opaco e altre operazioni di libreria DL utilizza questo. Se il tentativo di caricare non ha successo, dlopen () restituisce null. Ma il dlopen () restituisce la stessa maniglia del file se carica la stessa libreria molte volte.

Pur utilizzando la funzione Dlopen, il compilatore non esamina potenziali errori poiché non è a conoscenza dei tipi e dei prototipi che stiamo usando. La distribuzione della funzione Dlopen per il caricamento standard non sembra essere promossa da essa, ad eccezione di alcune situazioni minori. A proposito, è un approccio per migliorare l'introspezione. Quando il modulo condiviso è attualmente utilizzato da un altro programma, l'ottimizzazione del layout della memoria non è particolarmente interessata al caricamento condizionale. L'impronta di memoria non aumenta quando viene caricata una libreria precedentemente utilizzata. Evitare il monitoraggio del compilatore è pericoloso e crea una buona scrittura di bug. Inoltre, ci manca la possibile ottimizzazione del compilatore.

Esempio 1:

Ora, considera il seguente esempio per vedere la funzionalità della funzione dlopen nella lingua C. Nel primo passo, cariciamo alcune librerie standard C. Qui, cariciamo la nuova libreria “DLFCN.h "che viene utilizzato per definire le macro mentre costruisce l'argomento in modalità dlopen.

Quindi, introduciamo un'altra libreria all'interno del nostro programma "GNU/Lib-NAME.H". I file della libreria condivisa inclusi con GNU LIBC sono trovati dai programmi utente secondo le macro che definisce. La libreria GNU C offre le librerie fondamentali per i sistemi operativi GNU e GNU/Linux, nonché una vasta gamma di altri sistemi a base di Linux. Dopodiché, abbiamo l'implementazione del metodo principale. All'interno di ciò, dichiariamo l'oggetto puntatore "gestire" con la parola chiave void. Dichiariamo una funzione Sine puntatore che ha il doppio tipo di dati. C'è un'altra dichiarazione dell'oggetto puntatore "errore" per la gestione degli errori.

Successivamente, invochiamo la funzione Dlopen all'interno dell'oggetto "Handle". Il dlopen prende due argomenti: libm_so e "rtld_lazy". Qui, "libm_so" è il nome del file della libreria che fornisce funzioni matematiche come le funzioni trigonometriche. Questa libreria condivisa è richiesta quando utilizziamo la funzione sinusoidale. Il "rtld_lazy" è un altro argomento che chiama la funzione dlopen. Quando viene fatto riferimento a un determinato simbolo per la prima volta, i trasferimenti devono essere effettuati alla volta determinati dall'implementazione.

Poiché un processo potrebbe non fare riferimento a tutti i simboli in un file oggetto eseguibile, specificare RTLD LAZY dovrebbe migliorare le prestazioni sulle implementazioni che consentono il legame del simbolo dinamico. Successivamente, abbiamo una condizione IF-ELSE per la gestione degli errori quando l'oggetto Handle non riesce a eseguire la funzione Dlopen. Chiamiamo Dlerror per cancellare l'errore.

La funzione dlerror () fornisce una stringa con terminazione null che è leggibile dall'uomo e specifica la segnalazione del recente errore causato da una chiamata a una delle chiamate API Dlopen dall'ultima chiamata Dlerror. Quindi, lanciamo la funzione in questo modo: "(*void **) (& sine) = dlsym (maniglia, sin)". Dato che questo è strano, il casting è conforme all'ISO C che evita gli avvertimenti del compilatore. Utilizziamo la funzione DLSYM che ottiene il percorso di un simbolo specificato all'interno di un modulo di collegamento dinamico che è accessibile tramite una funzione dlopen ().

Inoltre, eseguiamo nuovamente l'operazione IF-ELSE per l'errore standard che viene generato quando il dlerror () non è nullo. Quindi, abbiamo un'istruzione printf in cui specifichiamo il valore sinusoidale da calcolare. Nell'ultimo passaggio, chiudiamo quell'oggetto condiviso invocando il dlclose per il manico restituito dal dlopen ().

#includere
#includere
#includere
#includere
int
main (int argc, char ** argv)

vuoto *manico;
doppio (*seno) (doppio);
Errore char *;
Handle = dlopen (libm_so, rtld_lazy);
Se (!maniglia)
fprintf (stderr, "%s \ n", dlerror ());
exit (exit_failure);

dlerror ();
*(void **) (& sine) = dlsym (handle, "sin");
if ((errore = dlerror ()) != Null)
fprintf (stderr, "%s \ n", errore);
exit (exit_failure);

printf ("%f \ n", (*senine) (4.0));
dlclose (maniglia);
usit (exit_success);

Utilizziamo l'opzione -LDL con il comando di compilazione C poiché questa è la libreria per l'interfaccia collegata Dlopen ed è richiesta. Quando viene effettuata l'esecuzione del file dlopen, visualizza il valore sinusoidale del valore precedentemente offerto.

Esempio 2:

Ora prendiamo un altro esempio di utilizzo della funzione Dlopen. Cariciamo il nostro programma con tutte le librerie C richieste per l'implementazione del codice Dlopen. Quindi, iniziamo il nostro programma all'interno del metodo principale. Qui, definiamo la stringa con la dichiarazione della variabile "SRC". Dichiariamo quindi le variabili del puntatore "Strlen", "Handle" ed "Errore".

Successivamente, chiamiamo la variabile Handle e distribuiamo la funzione Dlopen. La funzione dlopen inserisce la libreria condivisa “Libstr.Quindi "per le funzioni di gestione delle stringhe e il flag" rtld_lazy "che è già dimostrato nell'esempio precedente. Invochiamo la funzione dlerror all'interno della variabile "errore" per cancellare l'errore generato dalla funzione dlopen. L'IF-Else viene utilizzato per esaminare gli errori.

Quindi, otteniamo l'indirizzo della funzione Strlen usando la funzione DLSYM e verifichiamo gli errori mentre lo facciamo. Successivamente, utilizziamo la funzione printf per chiamare la funzione strnlen per restituire la lunghezza della stringa data. Alla fine, chiudiamo la libreria condivisa con la funzione dlclose.

#includere
#includere
#includere
#includere
int main (vuoto)

char* src = "ciao linux";
int ( *strlen) (const char *);
vuoto *manico;
Errore char *;
Handle = dlopen ("./libstr.quindi ", rtld_lazy);
errore = dlerror ();
Se(!Hands || errore != Null) printf ("Il tentativo della libreria di caricamento non è riuscito!\ n%s \ n ", errore);
return -1;
strlen = dlsym (maniglia, "strlen");
errore = dlerror ();
Se(!strlen || errore == null) printf ("%s \ n", errore); return -1;
printf ("La lunghezza della stringa è:%d \ n", strlen (src));
dlclose (maniglia);
restituzione 0;

Utilizziamo il seguente comando per l'esecuzione del programma dato. Qui, il flag -lstr viene utilizzato per la funzione di lunghezza della stringa e l'LDL viene utilizzato per il file della libreria Dlopen. Il programma compilato fornisce la lunghezza della stringa come mostrato nella shell:

Conclusione

Le informazioni sono fornite in merito alla funzione dlopen della lingua C in questo articolo. Abbiamo una breve introduzione della funzione Dlopen. Quindi, abbiamo implementato due esempi. La funzione restituisce un identificatore che definisce la libreria aperta. Gli indirizzi delle funzioni all'interno della libreria aperta vengono quindi determinati usando questo identificatore e la funzione DLSYM. L'indirizzo di una funzione all'interno di una libreria che è già stata aperta utilizzando Dlopen è possibile trovare utilizzando la funzione DLSYM.