dlvsym(3) возвращает адрес символа из общего объекта или исполняемого

Other Alias

dlsym

ОБЗОР

#include <dlfcn.h>

void *dlsym(void *handle, const char *symbol);

#define _GNU_SOURCE
#include <dlfcn.h>

void *dlvsym(void *handle, char *symbol, char *version);

Компонуется при указании параметра -ldl.

ОПИСАНИЕ

Функции dlsym() передаётся «описатель» динамически загруженного объекта, возвращаемого dlopen(3) и имя символа (с null в конце). В результате функция возвращает адрес, по которому символ расположен в памяти. Если символ не найден в указанном объекте или во всех общих объектах, которые были автоматически загружены dlopen(3) на момент загрузки объекта, то dlsym() возвращает NULL (поиск, выполняемый dlsym(), охватывает всё дерево зависимостей этих общих объектов).

Так как значение символа может быть NULL (и поэтому возвращаемый dlsym() NULL не указывает на ошибку), правильным способом проверки на ошибку является: вызов dlerror(3) для очистки старых условий ошибки, затем вызов dlsym(), затем повторный вызов dlerror(3), сохранив его возвращаемое значение в переменную, а затем проверка не равно ли это сохранённое значение NULL.

Существует два специальных псевдо-описателя, которые можно указать в handle:

RTLD_DEFAULT
Найти первое появление нужного символа, используя порядок поиска по умолчанию для общего объекта. Поиск выполняется среди глобальных символов исполняемого файла и его зависимостям, а также по символам в общих объектах, которые были динамически загружены с флагом RTLD_GLOBAL.
RTLD_NEXT
Найти следующее появление нужного символа, начиная поиск с текущего объекта. Это позволяет предоставить обёрточную функцию в другой общем объекте, таким образом, что например, определение функции в предварительно загружаемом общем объекте (смотрите LD_PRELOAD в ld.so(8)) может найти и вызвать «реальную» функцию, предоставленную в другом общем объекте (или, что важно, «следующее» определение функции в случаях, когда есть несколько уровней предварительной загрузки).

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении эти функции возвращают адрес, связанный с symbol. При ошибке возвращается NULL; причину ошибки можно определить с помощью dlerror(3).

ВЕРСИИ

Функция dlsym() есть в glibc 2.0 и новее. Функция dlvsym() впервые появилась в glibc 2.1.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
dlsym(), dlvsym() безвредность в нитяхбезвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

В POSIX.1-2001 есть описание dlsym(). Функция dlvsym() является расширением GNU.

ЗАМЕЧАНИЯ

История

Функция dlsym() является частью программного интерфейса dlopen, возникшего в SunOS. В этой системе нет dlvsym().

ПРИМЕР

Смотрите dlopen(3).