dlsym(3) Library Functions Manual dlsym(3)

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 :

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.
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).

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-2008.
GNU.

glibc 2.0. POSIX.1-2001.
glibc 2.1.

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 <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.

20 juillet 2023 Pages du manuel de Linux 6.05.01