dladdr(3) Library Functions Manual dladdr(3) NOM dladdr, dladdr1 - Traduire les adresses en informations symboliques BIBLIOTHEQUE Bibliotheque de liens dynamiques (libdl, -ldl) SYNOPSIS #define _GNU_SOURCE #include 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() determine si l'adresse specifiee dans addr est situee dans l'un des objets partages charges par l'application appelante. Si c'est le cas, alors dladdr() renvoie des informations sur l'objet partage et le symbole qui recouvrent addr. Cette information est renvoyee dans une structure Dl_info : typedef struct { const char *dli_fname; /* Chemin du fichier de l'objet partage contenant l'adresse */ void *dli_fbase; /* Adresse de base a laquelle l'objet partage est charge */ const char *dli_sname; /* Nom du symbole dont la definition recouvre addr */ void *dli_saddr; /* Adresse exacte du symbole dont le nom est dli_sname */ } Dl_info; Si aucun symbole correspondant a l'adresse addr ne peut etre trouve, dli_sname et dli_saddr sont definis a NULL. La fonction dladdr1() est comme dladdr() mais renvoie des informations additionnelles au moyen du parametre extra_info. Les informations renvoyees dependent de la valeur specifiee 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 parametre extra_info pointe vers un pointeur sur une structure link_map (c'est-a-dire struct link_map **), definie dans comme : struct link_map { ElfW(Addr) l_addr; /* Difference entre l'adresse dans le fichier ELF et l'adresse en memoire */ char *l_name; /* Chemin absolu du fichier ou l'objet a ete trouve */ ElfW(Dyn) *l_ld; /* La section dynamique de l'objet partage */ struct link_map *l_next, *l_prev; /* Chaine des objets charges */ /* Plus des champs supplementaires prives de l'implementation */ }; RTLD_DL_SYMENT Obtenir un pointeur vers une entree de la table de symboles ELF du symbole correspondant. Le parametre extra_info est un pointeur vers un pointeur sur un symbole : const ElfW(Sym)**. La macro ElfW() convertit son parametre en un nom de type de donnees ELF adapte a l'architecture materielle. Par exemple, sur un systeme 64 bits, ElfW(Sym) produit le type de donnees nomme Elf64_Sym qui est defini dans comme : typedef struct { Elf64_Word st_name; /* Nom du symbole */ unsigned char st_info; /* Type et lien du symbole */ unsigned char st_other; /* Visibilite 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 chaines. Le champ st_info encode le type et le lien du symbole. Le type peut etre 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 : Valeur Description STT_NOTYPE Le type de ce symbole n'est pas defini STT_OBJECT Ce symbole est associe a un objet de donnees STT_FUNC Ce symbole est associe a un objet de code STT_SECTION Ce symbole est associe a une section STT_FILE Le nom de ce symbole est un nom de fichier STT_COMMON Ce symbole est un objet de donnees commun STT_TLS Ce symbole est un objet de donnees local au thread STT_GNU_IFUNC Ce symbole est un objet de code indirect La correspondance de symbole peut etre 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 : Valeur Description STB_LOCAL Symbole local STB_GLOBAL Symbole global STB_WEAK Symbole faible STB_GNU_UNIQUE Symbole unique Le champ st_other contient la visibilite du symbole qui peut etre 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 : Valeur Description STV_DEFAULT Regles de visibilite par defaut du symbole STV_INTERNAL Classe cachee specifique au processeur STV_HIDDEN Le symbole n'est pas disponible dans d'autres modules STV_PROTECTED Non preemptible, non exporte VALEUR RENVOYEE En cas de succes, ces fonctions renvoient une valeur non nulle. Si l'adresse specifiee dans addr peut etre mise en correspondance avec un objet partage, mais pas vers un symbole dans l'objet partage, alors les champs info->dli_sname et info->dli_saddr sont mis a NULL. Si l'adresse specifiee dans addr ne peut pas etre mise en correspondance avec l'objet partage, alors ces fonctions renvoient 0. Dans ce cas, aucun message d'erreur n'est disponible avec dlerror(3). ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +---------------------------------+--------------------------+---------+ |Interface | Attribut | Valeur | +---------------------------------+--------------------------+---------+ |dladdr(), dladdr1() | Securite des threads | MT-Safe | +---------------------------------+--------------------------+---------+ STANDARDS GNU. HISTORIQUE dladdr() glibc 2.0. dladdr1() glibc 2.3.3. Solaris. BOGUES Quelquefois, les pointeurs de fonction passes a 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(), meme si la fonction utilisee en parametre devrait provenir d'une bibliotheque liee dynamiquement. Le probleme est que le pointeur de fonction ne sera resolu que lors de la compilation, mais pointe simplement vers la section de l'objet original plt (table de procedure d'edition des liens) qui redirige l'appel apres avoir demande a l'editeur dynamique de liens de resoudre le symbole. Un contournement consiste a compiler le code pour qu'il soit independant de son adressage : dans ce cas le compilateur ne peut pas preparer le pointeur a la compilation et gcc(1) generera du code qui chargera juste l'adresse finale du symbole depuis la table GOT (table d'offset globale) lors de l'execution, avant de la passer a dladdr(). VOIR AUSSI dl_iterate_phdr(3), dlinfo(3), dlopen(3), dlsym(3), ld.so(8) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Gregoire Scano Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 dladdr(3)