Man page - dladdr(3)

Packages contains this manual

Available languages:

en fr ru

Manual

dladdr

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ATTRIBUTS
STANDARDS
HISTORIQUE
BOGUES
VOIR AUSSI
TRADUCTION

NOM

dladdr, dladdr1 - Traduire les adresses en informations symboliques

BIBLIOTHÈQUE

BibliothĂšque de liens dynamiques ( libc , -lc )

SYNOPSIS

#define _GNU_SOURCE
#include <dlfcn.h>

int dladdr(const void * addr , Dl_info * info );
int dladdr1(const void *
addr , Dl_info * info , void ** extra_info ,
int
flags );

DESCRIPTION

La fonction dladdr () dĂ©termine si l’adresse spĂ©cifiĂ©e dans addr est situĂ©e dans l’un des objets partagĂ©s chargĂ©s par l’application appelante. Si c’est le cas, alors dladdr () renvoie des informations sur l’objet partagĂ© et le symbole qui recouvrent addr . Cette information est renvoyĂ©e dans une structure Dl_info :

typedef struct {
const char *dli_fname; /* Chemin du fichier de l’objet partagĂ©
contenant l’adresse */
void *dli_fbase; /* Adresse de base Ă  laquelle l’objet partagĂ©
est chargé */
const char *dli_sname; /* Nom du symbole dont la définition
recouvre addr */
void *dli_saddr; /* Adresse exacte du symbole dont
le nom est dli_sname */
} Dl_info;

Si aucun symbole correspondant Ă  l’adresse addr ne peut ĂȘtre trouvĂ©, dli_sname et dli_saddr sont dĂ©finis Ă  NULL.

La fonction dladdr1 () est comme dladdr () mais renvoie des informations additionnelles au moyen du paramĂštre extra_info . Les informations renvoyĂ©es dĂ©pendent de la valeur spĂ©cifiĂ©e dans flags et qui peut avoir l’une des valeurs suivantes :
RTLD_DL_LINKMAP

Obtient un pointeur vers la table d’association de liens pour le fichier correspondant. Le paramĂštre extra_info pointe vers un pointeur sur une structure link_map (c’est-Ă -dire struct link_map ** ), dĂ©finie dans <link.h> comme :

struct link_map {
ElfW(Addr) l_addr; /* DiffĂ©rence entre l’adresse
dans le fichier ELF et
l’adresse en mĂ©moire */
char *l_name; /* Chemin absolu du fichier oĂč
l’objet a Ă©tĂ© trouvĂ© */
ElfW(Dyn) *l_ld; /* La section dynamique de l’objet
partagé */
struct link_map *l_next, *l_prev;
/* Chaßne des objets chargés */
/* Plus des champs supplémentaires privés
de l’implĂ©mentation */
};

RTLD_DL_SYMENT

Obtenir un pointeur vers une entrĂ©e de la table de symboles ELF du symbole correspondant. Le paramĂštre extra_info est un pointeur vers un pointeur sur un symbole : const ElfW(Sym)** . La macro ElfW () convertit son paramĂštre en un nom de type de donnĂ©es ELF adaptĂ© Ă  l’architecture matĂ©rielle. Par exemple, sur un systĂšme 64 bits, ElfW(Sym) produit le type de donnĂ©es nommĂ© Elf64_Sym qui est dĂ©fini dans <elf.h> comme :

typedef struct {
Elf64_Word st_name; /* Nom du symbole */
unsigned char st_info; /* Type et lien du symbole */
unsigned char st_other; /* Visibilité du symbole */
Elf64_Section st_shndx; /* Index de section */
Elf64_Addr st_value; /* Valeur du symbole */
Elf64_Xword st_size; /* Taille du symbole */
} Elf64_Sym;

Le champ st_name est un index dans la table de chaĂźnes.

Le champ st_info encode le type et le lien du symbole. Le type peut ĂȘtre extrait en utilisant la macro ELF64_ST_TYPE (st_info) (ou ELF32_ST_TYPE() sur les plateformes 32 bits) qui retourne une des valeurs suivantes :

Image grohtml-3879998-1.png

La correspondance de symbole peut ĂȘtre extraite du champ st_info en utilisant la macro ELF64_ST_BIND(st_info) (ou ELF32_ST_BIND() sur les plateformes 32 bits) et renvoie l’une des valeurs suivantes :

Image grohtml-3879998-2.png

Le champ st_other contient la visibilitĂ© du symbole qui peut ĂȘtre extraite en utilisant la macro ELF64_ST_VISIBILITY(st_info) (ou ELF32_ST_VISIBILITY() sur les plateformes 32 bits) et renvoie une des valeurs suivantes :

Image grohtml-3879998-3.png

VALEUR RENVOYÉE

En cas de succĂšs, ces fonctions renvoient une valeur non nulle. Si l’adresse spĂ©cifiĂ©e dans addr peut ĂȘtre mise en correspondance avec un objet partagĂ©, mais pas vers un symbole dans l’objet partagĂ©, alors les champs info->dli_sname et info->dli_saddr sont mis Ă  NULL.

Si l’adresse spĂ©cifiĂ©e dans addr ne peut pas ĂȘtre mise en correspondance avec l’objet partagĂ©, alors ces fonctions renvoient 0 . Dans ce cas, aucun message d’erreur n’est disponible avec dlerror (3).

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3879998-4.png

STANDARDS

GNU.

HISTORIQUE

dladdr ()

glibc 2.0.

dladdr1 ()

glibc 2.3.3.

Solaris.

BOGUES

Quelquefois, les pointeurs de fonction passĂ©s Ă  dladdr () peuvent vous surprendre. Sur certaines architectures (notablement i386 et x86_64), dli_fname et dli_fbase peuvent au final pointer sur l’objet depuis lequel vous appelez dladdr (), mĂȘme si la fonction utilisĂ©e en paramĂštre devrait provenir d’une bibliothĂšque liĂ©e dynamiquement.

Le problĂšme est que le pointeur de fonction ne sera rĂ©solu que lors de la compilation, mais pointe simplement vers la section de l’objet original plt (table de procĂ©dure d’édition des liens) qui redirige l’appel aprĂšs avoir demandĂ© Ă  l’éditeur dynamique de liens de rĂ©soudre le symbole. Un contournement consiste Ă  compiler le code pour qu’il soit indĂ©pendant de son adressage : dans ce cas le compilateur ne peut pas prĂ©parer le pointeur Ă  la compilation et gcc (1) gĂ©nĂ©rera du code qui chargera juste l’adresse finale du symbole depuis la table GOT (table d’offset globale) lors de l’exĂ©cution, avant de la passer Ă  dladdr ().

VOIR AUSSI

dl_iterate_phdr (3), dlinfo (3), dlopen (3), dlsym (3), ld.so (8)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Grégoire Scano <gregoire.scano@malloc.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .