.\" -*- 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 "20 июля 2023 г." "Linux man\-pages 6.05.01" .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 .PP \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. .PP Для \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 .sp 1 .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 для получения библиотеки из списка путей поиска библиотек. Пример вывода работы программы: .PP .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 .