dlsym()

Получить адрес символа в разделяемой библиотеке

Прототип:

#include <dlfcn.h>
void * dlsym( void *handle,
const char *name );

Аргументы:

handle
Либо дескриптор разделяемой библиотеки, возвращаемой dlopen(), либо специальный флаг RTLD_NEXT или RTLD_DEFAULT.
name
Символьное имя символа в разделяемой библиотеке, адрес которого Вы хотите получить.

Библиотека:

libc

Описание:

Функция dlsym() дает возможность получить по имени адрес символа, определенного в разделяемой библиотеке.


Note: Функция 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 системной библиотеки