dlsym
Section: C Library Functions (3)
Updated: 7 janvier 2023
Index
Return to Main Contents
NOM
dlsym, dlvsym - Obtenir l'adresse d'un symbole dans un objet ou exécutable
partagé
BIBLIOTHÈQUE
Bibliothèque de liens dynamiques (libdl, -ldl)
SYNOPSIS
#include <dlfcn.h>
void *dlsym(void *restrict handle, const char *restrict symbol);
#define _GNU_SOURCE
#include <dlfcn.h>
void *dlvsym(void *restrict handle, const char *restrict symbol,
const char *restrict version);
DESCRIPTION
La fonction dlsym() prend comme arguments un « descripteur » d'un objet
partagé et chargé dynamiquement renvoyé par dlopen() et un nom de symbole
terminé par l'octet NULL final, et renvoie l'adresse où ce symbole a été
chargé en mémoire. Si le symbole n'est pas trouvé, soit dans l'objet
spécifié, soit dans n'importe quels objets chargés automatiquement par
dlopen() lorsque ces objets ont été chargés, dlsym() renvoie NULL. La
recherche effectuée par dlsym() est d'abord en largeur à travers l'arbre
des dépendances de ces objets partagés.
Dans certains cas inhabituels (voir NOTES), le symbole peut vraiment avoir
la valeur NULL. Par conséquent, une valeur NULL renvoyée par dlsym()
n'indique pas nécessairement une erreur. La bonne manière de distinguer une
erreur d'un symbole ayant NULL pour valeur est d'appeler dlerror() pour
effacer toute ancienne condition d'erreur, puis d'appeler dlsym() et
enfin d'appeler dlerror() une nouvelle fois en sauvegardant sa valeur de
retour dans une variable pour finalement vérifier si la valeur sauvegardée
n'est pas NULL.
Il y a deux pseudo-descripteurs qui peuvent être spécifiés dans handle :
- RTLD_DEFAULT
-
Trouver la première occurence du symbole recherché en utilisant l'ordre de
recherche par défaut pour objet partagé. La recherche inclut les symboles
globaux dans l'exécutable et ses dépendances de même que les symboles dans
les objets partagés chargés dynamiquement avec le drapeau RTLD_GLOBAL.
- RTLD_NEXT
-
Trouver la prochaine occurrence du symbole recherché dans l'ordre de
recherche après l'objet courant. Cela permet de fournir une enveloppe autour
d'une fonction dans un autre objet partagé de façon à ce que, par exemple,
la définition d'une fonction dans un objet partagé préchargé (voir
LD_PRELOAD dans ld.do(8)) peut trouver et invoquer la fonction
« réelle » fournie dans un autre objet partagé (ou bien la « prochaine »
définition de la fonction dans les cas où il y a plusieurs couches de
préchargement).
La macro de test de fonctionnalité _GNU_SOURCE doit être définie pour
obtenir les définitions de RTLD_DEFAULT et RTLD_NEXT depuis
<dlfcn.h>.
La fonction dlvsym() effectue la même chose que dlsym() mais prend une
version sous forme de chaîne comme argument supplémentaire.
VALEUR RENVOYÉE
En cas de succès, ces fonctions renvoient l'adresse associée au
symbol. En cas d'erreur, elles renvoient NULL ; la cause de l'erreur peut
être diagnostiquée avec dlerror(3).
VERSIONS
dlsym() est présente dans les versions 2.0 et ultérieures de la
glibc. dlvsym() est apparue dans la version 2.1 de la glibc.
ATTRIBUTS
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface | Attribut | Valeur
|
dlsym(),
dlvsym()
| Sécurité des threads | MT-Safe
|
STANDARDS
POSIX.1-2001 décrit dlsym(). La fonction dlvsym() est une extension
GNU.
NOTES
Il y a plusieurs scenarios pour lesquels l'adresse d'un symbole global a la
valeur NULL. Par exemple, un symbole peut être placé à l'adresse zéro par
l'éditeur de liens via un script d'éditeur de liens ou avec l'option en
ligne de commande --defsym. Les symboles faibles non définis ont
également NULL pour valeur. Enfin, la valeur du symbole peut être le
résultat d'une fonction de résolution de fonction indirecte GNU (IFUNC) qui
renvoie NULL comme valeur de résolution. Dans ce dernier cas, dlsym()
renvoie également NULL sans erreur. Cependant, dans les deux cas précédents,
le comportement de l'éditeur de liens dynamiques de GNU n'est pas uniforme :
le traitement des relocalisations réussit et la valeur du symbole peut être
NULL, mais dlsym() échoue et dlerror() indique une erreur de
recherche.
Historique
La fonction dlsym() fait partie de l'API de dlopen, dérivée de SunOS. Ce
système ne possède pas dlvsym().
EXEMPLES
Consultez dlopen(3).
VOIR AUSSI
dl_iterate_phdr(3), dladdr(3), dlerror(3), dlinfo(3),
dlopen(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 à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- VERSIONS
-
- ATTRIBUTS
-
- STANDARDS
-
- NOTES
-
- Historique
-
- EXEMPLES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 04:35:47 GMT, May 23, 2024