.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (C) 2015 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH dlinfo 3 "31 октября 2023 г." "Linux man\-pages 6.06" .SH ИМЯ dlinfo \- возвращает информацию о динамически загруженном объекте .SH LIBRARY Dynamic linking library (\fIlibdl\fP, \fI\-ldl\fP) .SH СИНТАКСИС .nf \fB#define _GNU_SOURCE\fP \fB#include \fP \fB#include \fP .P \fBint dlinfo(void *restrict \fPhandle\fB, int \fPrequest\fB, void *restrict \fPinfo\fB);\fP .fi .SH ОПИСАНИЕ Функция \fBdlinfo\fP() возвращает информацию о динамически загруженном объекте, на который указывает \fIhandle\fP (обычно полученный ранее вызовом \fBdlopen\fP(3) или \fBdlmopen\fP(3)). В аргументе \fIrequest\fP указывается какую информацию нужно получить. Аргумент \fIinfo\fP — указатель на буфер для хранения информации, возвращаемой вызовом; тип данного аргумента зависит от \fIrequest\fP. .P Для \fIrequest\fP поддерживаются следующие значения (соответствующий тип \fIinfo\fP показан в скобках): .TP \fBRTLD_DI_LMID\fP (\fILmid_t *\fP) Возвратить ID списка карты связи (link\-map list, пространство имён), в который загружен \fIhandle\fP. .TP \fBRTLD_DI_LINKMAP\fP (\fIstruct link_map **\fP) Возвратить указатель на структуру \fIlink_map\fP, соответствующую \fIhandle\fP. Аргумент \fIinfo\fP указывает на указатель на структуру \fIlink_map\fP, определённую в \fI\fP следующим образом: .IP .in +4n .EX struct link_map { ElfW(Addr) l_addr; /* Difference between the address in the ELF file and the address in memory */ char *l_name; /* Absolute pathname where object was found */ ElfW(Dyn) *l_ld; /* Dynamic section of the shared object */ struct link_map *l_next, *l_prev; /* Chain of loaded objects */ \& /* Plus additional fields private to the implementation */ }; .EE .in .TP \fBRTLD_DI_ORIGIN\fP (\fIchar *\fP) Скопировать путь источника общего объекта соответствующего \fIhandle\fP в место, указанное \fIinfo\fP. .TP \fBRTLD_DI_SERINFO\fP (\fIDl_serinfo *\fP) Возвратить пути поиска библиотек общего объекта, на который указывает \fIhandle\fP. Аргумент \fIinfo\fP — указатель на \fIDl_serinfo\fP с путями поиска. Так как количество путей поиска может быть разным, то размер структуры, на которую указывает \fIinfo\fP, может быть различным. Запрос \fBRTLD_DI_SERINFOSIZE\fP, описанный далее, позволяет приложению установить подходящий размер. Вызывающий должен выполнить следующие шаги: .RS .IP (1) 5 Использовать запрос \fBRTLD_DI_SERINFOSIZE\fP для заполнения структуры \fIDl_serinfo\fP размером (\fIdls_size\fP) структуры, необходимой для последующего запроса \fBRTLD_DI_SERINFO\fP. .IP (2) Выделить буфер \fIDl_serinfo\fP правильного размера (\fIdls_size\fP). .IP (3) Использовать запрос \fBRTLD_DI_SERINFOSIZE\fP для заполнения полей \fIdls_size\fP и \fIdls_cnt\fP буфера, выделенного на предыдущем шаге. .IP (4) Использовать \fBRTLD_DI_SERINFO\fP для получения путей поиска библиотек. .RE .IP Структура \fIDl_serinfo\fP определена следующим образом: .IP .in +4n .EX typedef struct { size_t dls_size; /* Size in bytes of the whole buffer */ unsigned int dls_cnt; /* Number of elements in \[aq]dls_serpath\[aq] */ Dl_serpath dls_serpath[1]; /* Actually longer, \[aq]dls_cnt\[aq] elements */ } Dl_serinfo; .EE .in .IP Каждый из элементов \fIdls_serpath\fP, в упомянутой выше структуре, представляет собой структуру следующего вида: .IP .in +4n .EX typedef struct { char *dls_name; /* имя каталога в путях поиска библиотек */ unsigned int dls_flags; /* показывает, откуда возник каталог */ } Dl_serpath; .EE .in .IP Поле \fIdls_flags\fP в настоящее время не используется и всегда равно нулю. .TP \fBRTLD_DI_SERINFOSIZE\fP (\fIDl_serinfo *\fP) Заполнить поля \fIdls_size\fP и \fIdls_cnt\fP структуры \fIDl_serinfo\fP, на которую указывает \fIinfo\fP, значениями, подходящими для выделения буфера, который будет использоваться в последующем запросе \fBRTLD_DI_SERINFO\fP. .TP \fBRTLD_DI_TLS_MODID\fP (\fIsize_t *\fP, начиная с glibc 2.4) Получить ID модуля сегмента TLS (локальное хранилище нити) общего объекта, которое используется в перемещениях TLS. Если этот объект не задаёт сегмент TLS, то в \fI*info\fP помещается ноль. .TP \fBRTLD_DI_TLS_DATA\fP (\fIvoid **\fP, начиная с glibc 2.4) Получить указатель на блок TLS вызывающей нити, соответствующий этому сегменту TLS общего объекта. Если этот объект не задаёт сегмент PT_TLS, или если у вызывающей нити для этого не выделен блок, то в \fI*info\fP помещается NULL. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении \fBdlinfo\fP() возвращает 0. При ошибке возвращается \-1; причину ошибки можно узнать с помощью \fBdlerror\fP(3). .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBdlinfo\fP() T} Безвредность в нитях MT\-Safe .TE .SH ВЕРСИИ The sets of requests supported by the various implementations overlaps only partially. .SH СТАНДАРТЫ GNU. .SH ИСТОРИЯ glibc 2.3.3. Solaris. .SH ПРИМЕРЫ Программа, показанная ниже, открывает общие объекты с помощью \fBdlopen\fP(3), а затем использует запросы \fBRTLD_DI_SERINFOSIZE\fP и \fBRTLD_DI_SERINFO\fP для получения библиотеки из списка путей поиска библиотек. Пример вывода работы программы: .P .in +4n .EX $ \fB./a.out /lib64/libm.so.6\fP dls_serpath[0].dls_name = /lib64 dls_serpath[1].dls_name = /usr/lib64 .EE .in .SS "Исходный код программы" .\" SRC BEGIN (dlinfo.c) \& .EX #define _GNU_SOURCE #include #include #include #include \& int main(int argc, char *argv[]) { void *handle; Dl_serinfo serinfo; Dl_serinfo *sip; \& if (argc != 2) { fprintf(stderr, "Usage: %s \en", argv[0]); exit(EXIT_FAILURE); } \& /* Obtain a handle for shared object specified on command line. */ \& handle = dlopen(argv[1], RTLD_NOW); if (handle == NULL) { fprintf(stderr, "dlopen() failed: %s\en", dlerror()); exit(EXIT_FAILURE); } \& /* Discover the size of the buffer that we must pass to RTLD_DI_SERINFO. */ \& if (dlinfo(handle, RTLD_DI_SERINFOSIZE, &serinfo) == \-1) { fprintf(stderr, "RTLD_DI_SERINFOSIZE failed: %s\en", dlerror()); exit(EXIT_FAILURE); } \& /* Allocate the buffer for use with RTLD_DI_SERINFO. */ \& sip = malloc(serinfo.dls_size); if (sip == NULL) { perror("malloc"); exit(EXIT_FAILURE); } \& /* Initialize the \[aq]dls_size\[aq] and \[aq]dls_cnt\[aq] fields in the newly allocated buffer. */ \& if (dlinfo(handle, RTLD_DI_SERINFOSIZE, sip) == \-1) { fprintf(stderr, "RTLD_DI_SERINFOSIZE failed: %s\en", dlerror()); exit(EXIT_FAILURE); } \& /* Fetch and print library search list. */ \& if (dlinfo(handle, RTLD_DI_SERINFO, sip) == \-1) { fprintf(stderr, "RTLD_DI_SERINFO failed: %s\en", dlerror()); exit(EXIT_FAILURE); } \& for (size_t j = 0; j < serinfo.dls_cnt; j++) printf("dls_serpath[%zu].dls_name = %s\en", j, sip\->dls_serpath[j].dls_name); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "СМ. ТАКЖЕ" \fBdl_iterate_phdr\fP(3), \fBdladdr\fP(3), \fBdlerror\fP(3), \fBdlopen\fP(3), \fBdlsym\fP(3), \fBld.so\fP(8) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .