Funzione dlsym 3 c

Funzione dlsym 3 c
“Linux ha escogitato molte delle sue funzioni uniche per eseguire attività di routine. La funzione dlsym () è una di queste. L'obiettivo della funzione dlsym () è trovare l'indirizzo di un simbolo definito specificato in una DLL (biblioteca di collegamento dinamico) che è stato reso accessibile tramite una chiamata di funzione dlopen (). Dopo il caricamento del file Dynamic Condividy Oggetto (Libreria di collegamento Common Link) indicato dal nome del file stringa a terminazione NULL, la funzione dlopen () emette una "connessione" anonima per l'oggetto caricato. Il simbolo nominato è cercato nella biblioteca di collegamento dinamico (DLL) che è stato recuperato con il metodo dlopen (). In questo articolo, parleremo dell'uso di dlsym ().

Se il simbolo desiderato non è presente in quella DLL, le DLL dipendenti di quella DLL verranno cercate, dopo qualsiasi dipendenza di quelle, e così via in modo da ampiezza fino a quando non viene trovato il simbolo desiderato o tutte le DLL hanno stato perquisito per questo scopo. Sebbene la sequenza in cui vengono cercate le DLL dipendenti allo stesso livello non sia determinata, questo ordine di ricerca determina come verranno identificati i simboli della duplicazione in DLL distinte. Tieni presente che le librerie dinamiche dipendenti scaricate non verranno caricate come conseguenza di una ricerca dlsym () di DLL dipendenti. Verranno scansionati solo le DLL che sono state caricate come componente delle DLL dipendenti di Dlopen ()."

Rtld_now: Se l'intera raccolta di DLL dipendenti deve essere resa disponibile per le successive chiamate alla funzione DLSYM (), questo flag viene utilizzato per invocare le librerie di collegamenti dinamici.

Rtld_lazy: Quando usiamo questo flag, non siamo in grado di trovare quale librerie di collegamenti dinamiche dipendenti vengano caricate non è noto.

RTLD Global: Le librerie appena caricate possono utilizzare i simboli specificati da questo pacchetto per la determinazione dei simboli.

RTLD_LOCAL: Dal momento che nessuna delle due flag è menzionata, questo è l'opposto di RTLD Global e il valore predefinito.

Ecco la sintassi del comando dlsym ():

#includere
# void *dlsym (void *__ Limit__ gestore, const char *__ limit__ symbol_name);

Il file di intestazione in cui è definita la funzione dlsym () . "Symbol_name" è la stringa di caratteri che è una rappresentazione del nome del simbolo e "Handler" è il valore ottenuto da una chiamata a dlopen () (che non è stato ancora restituito su richiesta a dlclose ()).

Il valore null viene restituito, se il manico non punta a una DLL appropriata aperta da dlopen (). Il valore null viene restituito dalla funzione dlsym () se nessuna dll collegata al gestore corrisponde al simbolo denominato (nome del simbolo).

Crea il DLSYM.C del file che utilizza l'editor VIM o qualsiasi editor a tua scelta, che può includere nano ecc.

Scrivi il codice indicato nella schermata seguente nel file C creato nel passaggio precedente. I file di intestazione sono inclusi nelle prime quattro righe di codice nel codice di esempio seguente. Successivamente, viene lanciata la funzione principale e all'interno della funzione principale, viene creato un puntatore del gestore del tipo di vuoto. La riga di codice precedente dichiara un puntatore codificato dai caratteri del tipo di vuoto.

Usando quello, abbiamo invocato il metodo Dlopen e fornito la bandiera pigra RTLD insieme alla posizione del .Quindi file (che è un file condiviso dinamico in Linux). La variabile del gestore manterrà i risultati di dlopen. Restituendo 1, la riga successiva determina se il dlopen ha caricato correttamente la libreria di collegamento dinamico. In caso di guasto, l'errore è stato scritto sullo schermo e la funzione principale è stata terminata.

Dopo l'espressione condizionale, ora chiamiamo il metodo dlerror () per correggere l'errore esistente. Non appena aggiungiamo 1 intero ASCII al simbolo codificato del tipo di carattere che abbiamo definito, avrà il valore "Puts."La lunghezza della stringa è stata calcolata nella riga successiva e salvata nella variabile di lunghezza codificata, che è stata quindi impiegata nel ciclo per la decodifica. Usiamo il simbolo finale "0" per terminare il codice dopo il loop. Successivamente, abbiamo eseguito il metodo DLSYM (), passando il gestore e i parametri del codice decodificato e la variabile di output includeva i risultati.

Quando si invoca la funzione dlsym () per compilare un file C, il processo di compilazione in un compilatore C differisce da un comando di compilazione standard. Creeresti il ​​programma utilizzando il seguente comando se fosse in un file chiamato "DLSYM.C":

$ gcc -rdynamic -o foo dlsym.c -ldl

Dopo una raccolta riuscita, il file di output viene creato e dato il nome dlsym.fuori. Basta immettere il comando./dlsym.Out e premi il tasto Invio per eseguire il file di output. L'output del file verrà visualizzato sullo schermo del terminale in un sistema operativo simile a Unix o Linux.

Utilizzando l'editor VIM, abbiamo apportato una piccola regolazione alle ultime righe di codici del file C. L'istruzione di stampa alla fine della funzione principale deve essere sostituita con l'output, che è stata trasformata nella funzione Puts. Nei segni di doppia preventivo dello schermo, il testo è stato aggiunto.

Ora compila di nuovo il codice e vedi l'output sullo schermo del terminale; Senza utilizzare l'istruzione di stampa, otteniamo l'output sullo schermo utilizzando il nostro valore di output che viene modificato nella funzione Puts. Ecco l'output di questo particolare file di codice mostrato sopra.

Conclusione

All'interno del paragrafo introduttivo di questo articolo, abbiamo discusso dell'uso della funzione DLSYM () 3 C per scoprire l'indirizzo di un simbolo definito specificato in DLL. Per questo abbiamo discusso ed elaborato due chiari esempi di C nel sistema operativo Kali Linux. Entrambi gli esempi sono molto semplici ma molto efficienti contemporaneamente e dimostrano molto chiaramente l'uso della funzione dlsym () per una migliore comprensione.