Sous-routine dlsym

Objectif

Recherche l'emplacement d'un symbole dans un module chargé avec dlopen.

Syntaxe

#include <dlfcn.h>
void *dlsym(Handle, Symbol);
void *Handle;
const char *Symbol;

Descriptif

La sous-routine dlsym recherche un symbole nommé exporté à partir d'un module chargé par un appel précédent à la sous-routine dlopen . Seuls les symboles exportés sont détectés par dlsym. Voir la commande ld pour savoir comment exporter des symboles à partir d'un module.
Article Descriptif
Anse Indique une valeur renvoyée par un appel précédent à dlopen ou à l'un des descripteurs spéciaux RTLD_DEFAULT, RTLD_NEXT ou RTLD_ME.
Symbole Indique le nom d'un symbole exporté à partir du module référencé sous la forme d'unNULL-terminated string ou le nom du symbole spécial RTLD_ENTRY.
Remarque: les noms de symbole C++ doivent être transmis à dlsym sous forme de mangeoires ; dlsym n'effectue aucun démontage de nom pour le compte de l'application appelante.

Dans le cas du descripteur spécial RTLD_DEFAULT, dlsym recherche le symbole nommé en commençant par le premier module chargé. Il parcourt ensuite la liste des modules chargés initiaux et des modules globaux obtenus avec dlopen jusqu'à ce qu'une correspondance soit trouvée. Cette recherche suit le modèle par défaut utilisé pour relocaliser tous les modules dans le processus.

Dans le cas du descripteur spécial RTLD_NEXT, dlsym recherche le symbole nommé dans les modules qui ont été chargés après le module à partir duquel l'appel dlsym est effectué.

Dans le cas du descripteur spécial RTLD_ME, dlsym recherche le symbole nommé dans les modules qui ont été chargés en commençant par le module à partir duquel l'appel dlsym est effectué.

Dans le cas du nom de symbole spécial RTLD_ENTRY, dlsym renvoie le point d'entrée du module. Le point d'entrée, s'il est présent, est la valeur du symbole de section de chargeur du module marqué comme point d'entrée.

Dans le cas de RTLD_DEFAULT, RTLD_NEXTet RTLD_ME, si les modules recherchés ont été chargés à partir d'appels dlopen , dlsym effectue une recherche dans le module uniquement si l'appelant fait partie de la même hiérarchie de dépendances dlopen ou si l'accès à la recherche globale a été accordé au module. Pour plus d'informations sur le mode RTLD_GLOBAL , voir dlopen .

La recherche du symbole nommé est basée sur l'ordre en largeur du module et de ses personnes à charge. Si le module a été construit à l'aide de l'option d'éditeur de liens -G ou -brtl , les modules dépendants du module incluront tous les modules nommés sur la ligne de commande ld , dans l'ordre d'origine. Les éléments dépendants d'un module qui n'était pas lié à l'option d'éditeur de liens -G ou -brtl seront répertoriés dans un ordre non spécifié.

Valeurs renvoyées

Si le symbole nommé est trouvé, son adresse est renvoyée. Si le symbole nommé est introuvable,NULLest renvoyé et errno est défini sur 0. Si Descripteur ou Symbole n'est pas valide,NULLest renvoyé et errno est défini sur EINVAL .

Si la première définition trouvée est une exportation d'un symbole importé, cette définition répond à la recherche. L'adresse du symbole importé est renvoyée. Si la première définition est une importation différée, la définition est ignorée et la recherche se poursuit.

Si le symbole nommé fait référence à unBSSsymbole (structure de données non initialisée), la recherche se poursuit jusqu'à ce qu'une instance initialisée du symbole soit trouvée ou que le module et toutes ses personnes à charge aient été recherchés. Si une instance initialisée est trouvée, son adresse est renvoyée ; sinon, l'adresse de la première instance non initialisée est renvoyée.

Codes d'erreur

Article Descriptif
EINVAL Si le paramètre Handle ne fait pas référence à un module ouvert par dlopen qui est toujours chargé ou si le paramètre Symbol pointe vers une adresse non valide, la sous-routine dlsym renvoieNULLet errno est défini sur EINVAL.