Получить адрес символа в разделяемой библиотеке
#include <dlfcn.h>void * dlsym( void *handle,const char *name );
RTLD_NEXT
или RTLD_DEFAULT
.libc
Функция dlsym() дает возможность получить по имени адрес символа, определенного в разделяемой библиотеке.
Функция dlsym() доступна только для процессов с динамическим связыванием. |
Если handle - дескриптор, возвращенный dlopen(), то к моменту вызова функции он не должен быть закрыт с помощью dlclose(). Функция dlsym() также выполняет поиск символов в других библиотеках, загруженных в качестве зависимостей данной библиотеки.
Если handle является RTLD_NEXT
, dlsym() выполняет поиск в библиотеках, загруженных после текущей библиотеки.
Если handle является RTLD_DEFAULT
, dlsym() выполняет поиск во всех библиотеках текущего процесса в порядке загрузки.
В случае как с RTLD_NEXT
, так и с RTLD_DEFAULT
, если библиотеки были загружены с помощью dlopen(), dlsym() выполнит поиск в случае, если библиотека является частью той же иерархической зависимости или если библиотека была загружена с доступом к глобальному поиску (использовался режим RTLD_GLOBAL
).
Указатель на именованный символ в случае успеха или NULL
в случае ошибки.
Если возникла ошибка, более детальную информацию можно получить с помощью функции dlerror().
Использование dlsym() для получения указателя на функцию и указателя на глобальную переменную в разделяемой библиотеке:
typedef int (*foofunc)( int );void *handle;int *some_global_int;foofunc brain;/* Open a shared library. */handle = dlopen( "/usr/nto/x86/lib/libfoo.so.1", RTLD_NOW );/* Find the address of a function and a global integer. */brain = (foofunc)dlsym( handle, "takeover_world" );some_global_int = (int *)dlsym( handle, "my_global_int" );/* Invoke the function and print the int. */x = (*brain)( 5 );printf( "that global is %d\n", *some_global_int );
Проверка, определена ли функция, и вызов в положительном случае:
typedef int (*funcptr)( void );funcptr funk = NULL;funk = (funcptr)dlsym( RTLD_DEFAULT, "get_funky" );if ( funk != NULL ){(*funk)();}
POSIX 1003.1 X/Open Systems Interfaces Extension
Укаазтели на функции - источник огромного числа ошибок; старайтесь использовать typedef.
dladdr(), dlclose(), dlerror(), dlopen()
Предыдущий раздел: Описание API системной библиотеки