.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (C) 2015 Michael Kerrisk .\" and Copyright (C) 2008 Petr Baudis (dladdr caveat) .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH dladdr 3 "20 июля 2023 г." "Linux man\-pages 6.05.01" .SH ИМЯ dladdr, dladdr1 \- транслирует адрес в информацию о символе .SH LIBRARY Dynamic linking library (\fIlibdl\fP, \fI\-ldl\fP) .SH СИНТАКСИС .nf \fB#define _GNU_SOURCE\fP \fB#include \fP .PP \fBint dladdr(const void *\fP\fIaddr\fP\fB, Dl_info *\fP\fIinfo\fP\fB);\fP \fBint dladdr1(const void *\fP\fIaddr\fP\fB, Dl_info *\fP\fIinfo\fP\fB, void **\fP\fIextra_info\fP\fB,\fP \fB int \fP\fIflags\fP\fB);\fP .fi .SH ОПИСАНИЕ Функция \fBdladdr\fP() определяет, в каком из загруженных общих объектов приложения расположен адрес, указанный в \fIaddr\fP. Если объект находится, то \fBdladdr\fP() возвращает информацию об общем объекте и символе, который относится к адресу \fIaddr\fP. Данная информация возвращается в виде структуры \fIDl_info\fP: .PP .in +4n .EX typedef struct { const char *dli_fname; /* путь к общему объекту, который содержит адрес */ void *dli_fbase; /* начальный адрес, по которому расположен общий объект */ const char *dli_sname; /* имя символа, к которому относится адрес \fIaddr\fP */ void *dli_saddr; /* точный адрес символа с именем \fIdli_sname\fP */ } Dl_info; .EE .in .PP Если символ, соответствующий адресу \fIaddr\fP, не найден, то \fIdli_sname\fP и \fIdli_saddr\fP устанавливаются в NULL. .PP Функция \fBdladdr1\fP() подобна \fBdladdr\fP(), но возвращает дополнительную информацию в аргументе \fIextra_info\fP. Возвращаемая информация зависит от значения, указанного в \fIflags\fP, которое может быть одним из: .TP \fBRTLD_DL_LINKMAP\fP Obtain a pointer to the link map for the matched file. The \fIextra_info\fP argument points to a pointer to a \fIlink_map\fP structure (i.e., \fIstruct link_map\~**\fP), defined in \fI\fP as: .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_DL_SYMENT\fP Возвращает указатель на элемент символьной таблицы ELF с совпадающим символом. Аргумент \fIextra_info\fP — указатель на символьный указатель: \fIconst ElfW(Sym) **\fP. Макрос \fIElfW\fP() преобразует этот аргумент в имя типа данных ELF, подходящее для аппаратной архитектуры. Например, на 64\-битной платформе \fIElfW(Sym)\fP возвращает имя типа данных \fIElf64_Sym\fP, которое определено в \fI\fP так: .IP .in +4n .EX typedef struct { Elf64_Word st_name; /* имя символа */ unsigned char st_info; /* тип символа и привязка */ unsigned char st_other; /* видимость символа */ Elf64_Section st_shndx; /* номер раздела */ Elf64_Addr st_value; /* значение символа */ Elf64_Xword st_size; /* размер символа */ } Elf64_Sym; .EE .in .IP Поле \fIst_name\fP — номер в строковой таблице. .IP В поле \fIst_info\fP закодирован тип и привязка символа. Тип можно извлечь с помощью макроса \fBELF64_ST_TYPE(st_info)\fP (или \fBELF32_ST_TYPE()\fP, на 32\-битных платформах), который возвращает одно из следующих значений: .in +4n .TS lb lb lb l. Значение описание STT_NOTYPE тип символа не указан STT_OBJECT символ является объектом данных STT_FUNC символ является объектом кода STT_SECTION символ, связанный с разделом STT_FILE Symbol's name is filename STT_COMMON символ является объектом общих данных STT_TLS символ является объектом локальных данных нити STT_GNU_IFUNC символ является объектом скрытого кода .TE .in .IP Привязку символа можно извлечь из поля \fIst_info\fP с помощью макроса \fBELF64_ST_BIND(st_info)\fP (или \fBELF32_ST_BIND()\fP, на 32\-битных платформах), который возвращает одно из следующих значений: .in +4n .TS lb lb lb l. Значение описание STB_LOCAL локальный символ STB_GLOBAL глобальный символ STB_WEAK символ со слабой привязкой STB_GNU_UNIQUE уникальный символ .TE .in .IP В поле \fIst_other\fP содержится значение видимости символа, которую можно извлечь с помощью макроса \fBELF64_ST_VISIBILITY(st_info)\fP (или \fBELF32_ST_VISIBILITY()\fP, на 32\-битных платформах), который возвращает одно из следующих значений: .in +4n .TS lb lb lb l. Значение описание STV_DEFAULT правила видимости символов по умолчанию STV_INTERNAL скрытый класс, зависящий от процессора STV_HIDDEN Символ недоступен в других модулях STV_PROTECTED невыгружаемый, не экспортируется .TE .in .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении эти функции возвращают ненулевое значение. Если адрес, указанный в \fIaddr\fP, мог бы совпасть с общим объектом, но не с символом в общем объекте, то полям \fIinfo\->dli_sname\fP и \fIinfo\->dli_saddr\fP присваивается значение NULL. .PP .\" According to the FreeBSD man page, dladdr1() does signal an .\" error via dlerror() for this case. Если адрес, указанный \fIaddr\fP, мог бы совпасть с общим объектом, то эти функции возвращают 0. В этом случае сообщение об ошибке \fIне\fP доступно через \fBdlerror\fP(3). .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBdladdr\fP(), \fBdladdr1\fP() T} Безвредность в нитях MT\-Safe .TE .sp 1 .SH СТАНДАРТЫ GNU. .SH ИСТОРИЯ .TP \fBdladdr\fP() glibc 2.0. .TP \fBdladdr1\fP() glibc 2.3.3. .PP Solaris. .SH ДЕФЕКТЫ Иногда указатели на функции, передаваемые в \fBdladdr\fP(), могут вас удивить. На некоторых архитектурах (в частности, i386\- и x86\-64), \fIdli_fname\fP и \fIdli_fbase\fP могут указывать на объект, из которого вызывалась функция \fBdladdr\fP(), даже если функция, использовавшаяся как аргумент, должна быть из динамически скомпонованной библиотеки. .PP Проблема в том, что указатель на функцию по прежнему ищется во время компиляции, но всего лишь указывает на раздел \fIplt\fP (таблицу компоновки процедур) первоначального объекта (которая размещает вызов после запроса динамического компоновщика на поиск символа). Чтобы обойти это, вы можете попробовать скомпилировать независимый от размещения код: в этом случае компилятор больше не сможет подготовить указатель во время компиляции и \fBgcc\fP(1) создаст код, который просто загрузит конечный адрес символа из \fIgot\fP (глобальной таблицы смещений) при запуске до передачи его в \fBdladdr\fP(). .SH "СМ. ТАКЖЕ" \fBdl_iterate_phdr\fP(3), \fBdlinfo\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 .