Linux Dlopen-systeem in C

Linux Dlopen Systeem In C



De bibliotheekfunctie dlopen() is een zeer nuttige functie in de C-taal. De functie laadt de bibliotheek in het geheugen na het openen van een nieuwe. We gebruiken het over het algemeen om de bibliotheeksymbolen te laden die op het moment van compileren onbekend zijn. Dlopen() is een functie die in onze programma's wordt gebruikt. De DL-bibliotheek implementeert dlopen(), gedefinieerd in Dlfcn.h. Voor de functie dlopen zijn twee parameters nodig: de naam van het bibliotheekbestand en de vlag. De naam van het bestand is een dynamische bibliotheek en definieert of de afhankelijkheden van de bibliotheek meteen worden berekend. De dlopen() retourneert een 'handle' die moet worden beschouwd als een ondoorzichtige waarde en andere DL-bibliotheekbewerkingen gebruiken deze. Als de poging om te laden niet succesvol is, geeft dlopen() NULL terug. Maar de dlopen() retourneert dezelfde bestandshandle als het dezelfde bibliotheek vele malen laadt.

Tijdens het gebruik van de functie dlopen, onderzoekt de compiler niet op mogelijke fouten, omdat hij niet op de hoogte is van de typen en prototypes die we gebruiken. De inzet van de dlopen-functie voor standaard laden lijkt er niet door te worden bevorderd, op enkele kleine situaties na. Het is trouwens een benadering om introspectie te verbeteren. Wanneer de gedeelde module momenteel door een ander programma wordt gebruikt, is de optimalisatie van de geheugenlay-out niet bijzonder geïnteresseerd in voorwaardelijk laden. De geheugenvoetafdruk neemt niet toe wanneer een eerder gebruikte bibliotheek wordt geladen. Het vermijden van het monitoren van de compiler is gevaarlijk en zorgt voor goed schrijven van bugs. Bovendien missen we de mogelijke compiler-optimalisatie.

Voorbeeld 1:

Bekijk nu het volgende voorbeeld om de functionaliteit van de dlopen-functie in de C-taal te zien. In de eerste stap laden we enkele C-standaardbibliotheken. Hier laden we de nieuwe bibliotheek 'dlfcn.h' die wordt gebruikt om de macro's te definiëren tijdens het construeren van het dlopen-modusargument.







Vervolgens introduceren we een andere bibliotheek in ons programma 'gnu/lib-name.h'. De gedeelde bibliotheekbestanden die bij GNU libc worden geleverd, worden door de gebruikersprogramma's gevonden volgens de macro's die het definieert. De GNU C-bibliotheek biedt de fundamentele bibliotheken voor de GNU- en GNU/Linux-besturingssystemen, evenals een groot aantal andere op Linux gebaseerde systemen. Daarna hebben we de belangrijkste methode-implementatie. Daarbinnen verklaren we het aanwijzerobject 'handvat' met het void-sleutelwoord. We declareren een pointer-sinusfunctie met het datatype double. Er is nog een verklaring van het aanwijzerobject 'fout' voor foutafhandeling.



Daarna roepen we de dlopen-functie op in het 'handvat' -object. De dlopen heeft twee argumenten: LIBM_SO en 'RTLD_LAZY'. Hier is 'LIBM_SO' de naam van het bibliotheekbestand dat wiskundige functies zoals trigonometrische functies biedt. Deze gedeelde bibliotheek is vereist omdat we de sinusfunctie gebruiken. De 'RTLD_LAZY' is een ander argument dat de dlopen-functie aanroept. Wanneer voor de eerste keer naar een bepaald symbool wordt verwezen, moeten verplaatsingen worden uitgevoerd op een door de implementatie bepaald tijdstip.



Aangezien een proces mogelijk niet naar elk symbool in een uitvoerbaar objectbestand verwijst, zou het specificeren van de RTLD LAZY de prestaties moeten verbeteren op implementaties die de dynamische symboolbinding mogelijk maken. Vervolgens hebben we een if-else-voorwaarde voor foutafhandeling wanneer het handle-object de dlopen-functie niet kan uitvoeren. We noemen de dlerror om de fout te wissen.





De functie dlerror() biedt een null-terminated string die door mensen kan worden gelezen en specificeert de rapportage van de recente fout die is veroorzaakt door een aanroep naar een van de dlopen API-aanroepen sinds de laatste dlerror-aanroep. Vervolgens casten we de functie als volgt: '(*void**)(&sine)= dlsym(handle, sin)'. Omdat dit vreemd is, voldoet het casten aan ISO C, waardoor waarschuwingen van de compiler worden vermeden. We gebruiken de dlsym-functie die het pad van een symbool krijgt dat is gespecificeerd in een dynamische link-module die toegankelijk is via een dlopen()-functie.

We voeren ook de if-else-bewerking opnieuw uit voor de standaardfout die wordt gegenereerd wanneer de dlerror() niet NULL is. Vervolgens hebben we een printf-statement waarin we de te berekenen sinuswaarde specificeren. In de laatste stap sluiten we dat gedeelde object door de dlclose aan te roepen voor de handle die wordt geretourneerd door de dlopen().



#include
#include
#include
#include

int
hoofd ( int argc , char ** argv )
{
leegte * handvat ;
dubbele ( * van hen ) ( dubbele ) ;
char * fout ;

handvat = dlopen ( LIBM_SO , RTLD_LAZY ) ;
als ( ! handvat ) {
fprintf ( stderr , '%s \n ' , dlerror ( ) ) ;
Uitgang ( EXIT_FAILURE ) ;
}
dlerror ( ) ;

* ( leegte ** ) ( & van hen ) = dlsym ( handvat , 'zonder' ) ;

als ( ( fout = dlerror ( ) ) != NUL ) {
fprintf ( stderr , '%s \n ' , fout ) ;
Uitgang ( EXIT_FAILURE ) ;
}

printf ( '%f \n ' , ( * van hen ) ( 4.0 ) ) ;
dlclose ( handvat ) ;
Uitgang ( EXIT_SUCCESS ) ;
}

We gebruiken de -ldl optie met het C compilatie commando aangezien dit de bibliotheek is voor de dlopen gekoppelde interface en het is vereist. Wanneer de uitvoering van het dlopen-bestand is gemaakt, wordt de sinuswaarde van de eerder gegeven waarde weergegeven.

Voorbeeld 2:

Nu nemen we nog een voorbeeld van het gebruik van de dlopen-functie. We laden ons programma met alle benodigde C-bibliotheken voor de implementatie van de dlopen-code. Vervolgens starten we ons programma binnen de hoofdmethode. Hier definiëren we de string met de declaratie van de variabele 'src'. Vervolgens declareren we de pointervariabelen 'strlen', 'handle' en 'error'.

Vervolgens noemen we de handle-variabele en implementeren we de dlopen-functie. De dlopen-functie voert de gedeelde bibliotheek 'libstr.so' in voor stringverwerkingsfuncties en de vlag 'RTLD_LAZY' die al in het vorige voorbeeld is gedemonstreerd. We roepen de dlerror-functie aan binnen de 'error' -variabele om de fout te wissen die is gegenereerd door de dlopen-functie. De if-else wordt gebruikt om de fouten te onderzoeken.

Vervolgens verkrijgen we het adres van de strlen-functie met behulp van de dlsym-functie en verifiëren we de fouten terwijl we dit doen. Hierna gebruiken we de functie printf om de functie strnlen aan te roepen om de lengte van de gegeven string te retourneren. Uiteindelijk sluiten we de gedeelde bibliotheek met de dlclose-functie.

#include
#include
#include
#include
int hoofd ( leegte )
{
char * src = 'Hallo Linux' ;
int ( * strlen ) ( const char * ) ;
leegte * handvat ;
char * fout ;


handvat = dlopen ( './libstr.so' , RTLD_LAZY ) ;
fout = dlerror ( ) ;
als ( ! handvat || fout != NUL ) { printf ( 'Poging om bibliotheek te laden mislukt! \n %s \n ' , fout ) ;
opbrengst - 1 ; }

strlen = dlsym ( handvat , 'strlen' ) ;
fout = dlerror ( ) ;
als ( ! strlen || fout == NUL ) { printf ( '%s \n ' , fout ) ; opbrengst - 1 ; }

printf ( 'De lengte van de string is:%d \n ' , strlen ( src ) ) ;
dlclose ( handvat ) ;
opbrengst 0 ;
}

We gebruiken het volgende commando voor de uitvoering van het gegeven programma. Hier wordt de vlag -lstr gebruikt voor de tekenreekslengtefunctie en de ldl voor het dlopen-bibliotheekbestand. Het gecompileerde programma geeft de lengte van de string zoals getoond in de shell:

Conclusie

De informatie over de dlopen-functie van de C-taal wordt in dit artikel gegeven. We hebben een korte introductie van de dlopen-functie. Vervolgens hebben we twee voorbeelden geïmplementeerd. De functie retourneert een id die de geopende bibliotheek definieert. De adressen van de functies binnen de geopende bibliotheek worden vervolgens bepaald met behulp van deze identifier en de dlsym-functie. Het adres van een functie binnen een bibliotheek die al is geopend met dlopen, kan worden gevonden met behulp van de dlsym-functie.