Linux Dlopen система в C

Linux Dlopen Sistema V C



Библиотечната функция dlopen() е много полезна функция в езика C. Функцията зарежда библиотеката в паметта след отваряне на нова. Обикновено го използваме за зареждане на библиотечни символи, които са неизвестни по време на компилиране. Dlopen() е функция, която се използва в нашите програми. DL библиотеката изпълнява dlopen(), дефиниран в Dlfcn.h. За функцията dlopen са необходими два параметъра: името на библиотечния файл и флага. Името на файла е динамична библиотека и определя дали зависимостите на библиотеката се изчисляват веднага или не. dlopen() връща „ръкохватка“, която трябва да се разглежда като непрозрачна стойност и други операции на DL библиотека използват това. Ако опитът за зареждане е неуспешен, dlopen() връща NULL. Но dlopen() връща същия манипулатор на файла, ако зарежда една и съща библиотека много пъти.

Докато използва функцията dlopen, компилаторът не проверява за потенциални грешки, тъй като не е наясно с типовете и прототипите, които използваме. Разполагането на функцията dlopen за стандартно зареждане не изглежда да се насърчава от нея, с изключение на няколко незначителни ситуации. Между другото, това е подход за подобряване на интроспекцията. Когато споделеният модул в момента се използва от друга програма, оптимизацията на оформлението на паметта не се интересува особено от условно зареждане. Отпечатъкът от паметта не се увеличава, когато се зарежда използвана преди това библиотека. Избягването на мониторинга на компилатора е опасно и допринася за добро писане на грешки. Освен това ни липсва възможната оптимизация на компилатора.

Пример 1:

Сега разгледайте следния пример, за да видите функционалността на функцията dlopen в езика C. В първата стъпка зареждаме някои C стандартни библиотеки. Тук зареждаме новата библиотека „dlfcn.h“, която се използва за дефиниране на макросите, докато конструираме аргумента за режим dlopen.







След това въвеждаме друга библиотека в нашата програма „gnu/lib-name.h“. Споделените библиотечни файлове, включени в GNU libc, се намират от потребителските програми според макросите, които те дефинират. Библиотеката GNU C предлага основните библиотеки за операционните системи GNU и GNU/Linux, както и широк набор от други базирани на Linux системи. След това имаме основната реализация на метода. Вътре в него декларираме обекта-указател „handle“ с ключовата дума void. Ние декларираме указателна синус функция, която има тип данни double. Има друга декларация на указателния обект „грешка“ за обработка на грешки.



След това извикваме функцията dlopen вътре в обекта 'дръжка'. Dlopen приема два аргумента: LIBM_SO и „RTLD_LAZY“. Тук „LIBM_SO“ е името на библиотечния файл, който предоставя математически функции като тригонометрични функции. Тази споделена библиотека е необходима, тъй като използваме функцията синус. „RTLD_LAZY“ е друг аргумент, който извиква функцията dlopen. Когато даден символ се използва за първи път, преместванията трябва да се извършат във време, определено от изпълнението.



Тъй като процесът може да не препраща към всеки символ в изпълним обектен файл, указването на RTLD LAZY трябва да подобри производителността на реализации, които позволяват динамично свързване на символи. След това имаме условие if-else за обработка на грешки, когато обектът handle не успее да изпълни функцията dlopen. Извикваме dlerror, за да изчистим грешката.





Функцията dlerror() предоставя низ, завършващ с нула, който е четим от хора и указва отчитането на скорошната грешка, причинена от извикване на едно от извикванията на dlopen API след последното извикване на dlerror. След това прехвърляме функцията по следния начин: „(*void**)(&sine)= dlsym(handle, sin)“. Тъй като това е странно, кастингът е в съответствие с ISO C, което избягва предупрежденията от компилатора. Ние използваме функцията dlsym, която получава пътя на символ, който е посочен вътре в модул за динамична връзка, който е достъпен чрез функция dlopen().

Освен това изпълняваме отново операцията if-else за стандартната грешка, която се генерира, когато dlerror() не е NULL. След това имаме оператор printf, където указваме синусовата стойност, която да бъде изчислена. В последната стъпка затваряме този споделен обект, като извикваме dlclose за манипулатора, върнат от dlopen().



#include
#include
#include
#include

вътр
основен ( вътр argc , въглен ** argv )
{
невалиден * дръжка ;
двойно ( * техните ) ( двойно ) ;
въглен * грешка ;

дръжка = dlopen ( LIBM_SO , RTLD_ЛЕНИВ ) ;
ако ( ! дръжка ) {
fprintf ( stderr , '%с ' , dlerror ( ) ) ;
изход ( EXIT_FAILURE ) ;
}
dlerror ( ) ;

* ( невалиден ** ) ( и техните ) = dlsym ( дръжка , 'без' ) ;

ако ( ( грешка = dlerror ( ) ) != НУЛА ) {
fprintf ( stderr , '%с ' , грешка ) ;
изход ( EXIT_FAILURE ) ;
}

printf ( „%f ' , ( * техните ) ( 4.0 ) ) ;
dlclose ( дръжка ) ;
изход ( EXIT_SUCCESS ) ;
}

Ние използваме опцията -ldl с командата за компилиране на C, тъй като това е библиотеката за dlopen свързания интерфейс и е задължителна. Когато се изпълни файлът dlopen, той показва синусовата стойност на предварително зададената стойност.

Пример 2:

Сега ще вземем друг пример за използване на функцията dlopen. Зареждаме нашата програма с всички необходими C библиотеки за внедряване на dlopen кода. След това стартираме нашата програма вътре в основния метод. Тук дефинираме низа с декларацията на променливата „src“. След това декларираме променливите на указателя „strlen“, „handle“ и „error“.

След това извикваме променливата манипулатор и разгръщаме функцията dlopen. Функцията dlopen въвежда споделената библиотека „libstr.so“ за функции за обработка на низове и флага „RTLD_LAZY“, който вече беше демонстриран в предишния пример. Ние извикваме функцията dlerror вътре в променливата „error“, за да изчистим грешката, генерирана от функцията dlopen. If-else се използва за проверка на грешките.

След това получаваме адреса на функцията strlen с помощта на функцията dlsym и проверяваме грешките, докато правим това. След това използваме функцията printf, за да извикаме функцията strnlen, за да върнем дължината на дадения низ. В крайна сметка затваряме споделената библиотека с функцията dlclose.

#include
#include
#include
#include
вътр основен ( невалиден )
{
въглен * src = „Здравей Linux“ ;
вътр ( * strlen ) ( конст въглен * ) ;
невалиден * дръжка ;
въглен * грешка ;


дръжка = dlopen ( './libstr.so' , RTLD_ЛЕНИВ ) ;
грешка = dlerror ( ) ;
ако ( ! дръжка || грешка != НУЛА ) { printf ( „Неуспешен опит за зареждане на библиотека! ' , грешка ) ;
връщане - 1 ; }

strlen = dlsym ( дръжка , 'стрлен' ) ;
грешка = dlerror ( ) ;
ако ( ! strlen || грешка == НУЛА ) { printf ( '%с ' , грешка ) ; връщане - 1 ; }

printf ( „Дължината на низа е:%d ' , strlen ( src ) ) ;
dlclose ( дръжка ) ;
връщане 0 ;
}

Използваме следната команда за изпълнение на дадената програма. Тук флагът -lstr се използва за функцията за дължина на низа, а ldl се използва за файла на библиотеката dlopen. Компилираната програма дава дължината на низа, както е показано в обвивката:

Заключение

Информацията е предоставена относно функцията dlopen на езика C в тази статия. Имаме кратко представяне на функцията dlopen. След това внедрихме два примера. Функцията връща идентификатор, който дефинира отворената библиотека. След това адресите на функциите в отворената библиотека се определят с помощта на този идентификатор и функцията dlsym. Адресът на функция в библиотека, която вече е била отворена с помощта на dlopen, може да бъде намерен с помощта на функцията dlsym.