.\" -*- 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 "28 августа 2024 г." "Linux man\-pages 6.12" .SH НАИМЕНОВАНИЕ dlinfo \- возвращает информацию о динамически загруженном объекте .SH БИБЛИОТЕКА 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. .TP \fBRTLD_DI_PHDR\fP (\fIconst ElfW(Phdr *)\fP, since glibc 2.34.1) .\" glibc commit d056c212130280c0a54d9a4f72170ec621b70ce5 (2.36) .\" glibc commit 28ea43f8d64f0dd1f2de75525157730e1532e600 (2.35.1) .\" glibc commit 91c2e6c3db44297bf4cb3a2e3c40236c5b6a0b23 (2.34.1) Obtain the address of this shared object's program header and place it in \fI*info\fP. This \fBdlinfo\fP call returns the number of program headers in the shared object. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" On success, \fBdlinfo\fP() returns 0 (if not specified explicitly), or a positive value corresponding to the request. On failure, it returns \-1; the error can be diagnosed using \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 \[rs]n", 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\[rs]n", 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\[rs]n", 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\[rs]n", 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\[rs]n", dlerror()); exit(EXIT_FAILURE); } \& for (size_t j = 0; j < serinfo.dls_cnt; j++) printf("dls_serpath[%zu].dls_name = %s\[rs]n", 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 , Иван Павлов и Kirill Rekhov . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .