DLSYM(3) | Руководство программиста Linux | DLSYM(3) |
dlsym, dlvsym - возвращает адрес символа из общего объекта или исполняемого файла
#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. Поэтому NULL, возвращаемый dlsym(), ненужно считать ошибкой. Правильным способом определения ошибки, если символ равен NULL, является вызов dlerror(3) для сброса старого состояния ошибки, а затем вызов dlsym(), и повторный вызов dlerror(3), сохранение полученного значения в переменную и проверка этого значения на NULL.
Существует два специальных псевдо-описателя, которые можно указать в handle:
Чтобы получить определения RTLD_DEFAULT и RTLD_NEXT из <dlfcn.h>, нужно задать макрос тестирования свойств _GNU_SOURCE.
Функция 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(), никогда не будет равно NULL, если общий объект является результатом нормальной компиляции, так как глобальный символ никогда не размещается по адресу NULL. Тем не менее, есть ситуации, при которых поиск с помощью dlsym() может дать NULL в качестве значения символа. Например, значение символа может быть результатом неявной определительной функции GNU (IFUNC), которая возвращает NULL в качестве определённого значения.
Функция dlsym() является частью программного интерфейса dlopen, возникшего в SunOS. В этой системе нет dlvsym().
Смотрите dlopen(3).
dl_iterate_phdr(3), dladdr(3), dlerror(3), dlinfo(3), dlopen(3), ld.so(8)
2019-03-06 | Linux |