dlsym, dlvsym - Obtenir l'adresse d'un symbole dans un objet ou
exécutable partagé
Bibliothèque de liens dynamiques (
libdl,
-ldl)
#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);
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.
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).
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.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
dlsym(), dlvsym() |
Sécurité des threads |
MT-Safe |
POSIX.1-2001 décrit
dlsym(). La fonction
dlvsym() est une
extension GNU.
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.
La fonction
dlsym() fait partie de l'API de dlopen, dérivée
de SunOS. Ce système ne possède pas
dlvsym().
Consultez
dlopen(3).
dl_iterate_phdr(3),
dladdr(3),
dlerror(3),
dlinfo(3),
dlopen(3),
ld.so(8)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Grégoire Scano <
[email protected]>
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 à
[email protected]