dlsym(3)

НАИМЕНОВАНИЕ
dlsym, dlvsym - возвращает адрес символа из общего объекта или исполняемого файла

БИБЛИОТЕКА
Dynamic linking library (libdl, -ldl)

ОБЗОР
#include <dlfcn.h>

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

#define _GNU_SOURCE
#include <dlfcn.h>

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

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

В нестандартных ситуациях (смотрите ЗАМЕЧАНИЯ) в действительности значение символа может быть NULL. Поэтому NULL, возвращаемый dlsym(), ненужно считать ошибкой. Правильным способом определения ошибки, если символ равен NULL, является вызов dlerror(3) для сброса старого состояния ошибки, а затем вызов dlsym(), и повторный вызов dlerror(3), сохранение полученного значения в переменную и проверка этого значения на NULL.

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

RTLD_DEFAULT
    Найти первое появление нужного символа, используя порядок поиска по умолчанию для общего объекта. Поиск выполняется среди глобальных символов исполняемого файла и его зависимостям, а также по символам в общих объектах, которые были динамически загружены с флагом RTLD_GLOBAL.

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

Чтобы получить определения RTLD_DEFAULT и RTLD_NEXT из <dlfcn.h>, нужно задать макрос тестирования свойств _GNU_SOURCE.

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
On success, these functions return the address associated with symbol. On failure, they return NULL; the error can be diagnosed using dlerror(3).

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

СТАНДАРТЫ

dlsym()
    POSIX.1-2008.

dlvsym()
    GNU.

ИСТОРИЯ

dlsym()
    glibc 2.0. POSIX.1-2001.

dlvsym()
    glibc 2.1.

ПРИМЕЧАНИЯ
There are several scenarios when the address of a global symbol is NULL. For example, a symbol can be placed at zero address by the linker, via a linker script or with --defsym command-line option. Undefined weak symbols also have NULL value. Finally, the symbol value may be the result of a GNU indirect function (IFUNC) resolver function that returns NULL as the resolved value. In the latter case, dlsym() also returns NULL without error. However, in the former two cases, the behavior of GNU dynamic linker is inconsistent: relocation processing succeeds and the symbol can be observed to have NULL value, but dlsym() fails and dlerror() indicates a lookup error.

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

ПРИМЕРЫ
Смотрите dlopen(3).

СМОТРИТЕ ТАКЖЕ
dl_iterate_phdr(3), dladdr(3), dlerror(3), dlinfo(3), dlopen(3), ld.so(8)

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (<debian-l10n-russian@lists.debian.org>).