dlinfo(3) | Library Functions Manual | dlinfo(3) |
dlinfo - Obtenir des informations sur un objet chargé dynamiquement
Bibliothèque de liens dynamiques (libdl, -ldl)
#define _GNU_SOURCE #include <link.h> #include <dlfcn.h>
int dlinfo(void *restrict handle, int request, void *restrict info);
La fonction dlinfo() obtient des informations sur l'objet chargé dynamiquement et référencé par handle (habituellement obtenu par un appel préalable à dlopen(3) ou dlmopen(3)). Le paramètre request spécifie quelle information doit être renvoyée. Le paramètre info est un pointeur vers un tampon utilisé pour stocker les informations renvoyées par l'appel ; le type de ce paramètre dépend de request.
Les valeurs suivantes sont prises en charge pour request (avec le type correspondant pour info entre parenthèses) :
struct link_map {
ElfW(Addr) l_addr; /* Difference entre l'adresse
dans le fichier ELF et
l'adresse en mémoire */
char *l_name; /* Chemin absolu du fichier où
l'objet a été trouvé */
ElfW(Dyn) *l_ld; /* La section dynamique de l'objet
partagé */
struct link_map *l_next, *l_prev;
/* Chaîne des objets chargés */
/* Plus des champs supplémentaires privés
de l'implementation */ };
typedef struct {
size_t dls_size; /* Taille en octets du
tampon entier */
unsigned int dls_cnt; /* Nombre d'éléments
dans 'dls_serpath' */
Dl_serpath dls_serpath[1]; /* En fait plus long,
'dls_cnt' éléments */ } Dl_serinfo;
typedef struct {
char *dls_name; /* Nom du répertoire de recherche
de chemin de bibliothèque */
unsigned int dls_flags; /* Indique d'où ce
répertoire provient */ } Dl_serpath;
En cas de succès, dlinfo() renvoie 0. En cas d'erreur, elle renvoie -1 ; la cause de l'erreur peut être diagnostiquée avec dlerror(3).
dlinfo() est apparue la première fois dans la version 2.3.3 de la glibc.
Pour une explication des termes utilisés dans cette section, consulter attributes(7).
Interface | Attribut | Valeur |
dlinfo() | Sécurité des threads | MT-Safe |
Cette fonction est une extension GNU non standard.
Cette fonction dérive de la fonction Solaris de même nom et existe aussi sur d'autres systèmes. Les ensembles de requêtes prises en charge par les diverses implémentations ne se recouvrent que partiellement.
Le programme ci-dessous ouvre un objet partagé en utilisant dlopen(3) et utilise par la suite les requêtes RTLD_DI_SERINFOSIZE et RTLD_DI_SERINFO pour obtenir la liste de chemin de recherche de bibliothèques pour la bibliothèque. Voici un exemple de ce qui pourrait être observé lors de l'exécution du programme :
$ ./a.out /lib64/libm.so.6 dls_serpath[0].dls_name = /lib64 dls_serpath[1].dls_name = /usr/lib64
#define _GNU_SOURCE #include <dlfcn.h> #include <link.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) {
void *handle;
Dl_serinfo serinfo;
Dl_serinfo *sip;
if (argc != 2) {
fprintf(stderr, "Usage : %s <libpath>\n", argv[0]);
exit(EXIT_FAILURE);
}
/* Obtenir un gestionnaire pour l'objet partagé indiqué sur la
ligne de commande. */
handle = dlopen(argv[1], RTLD_NOW);
if (handle == NULL) {
fprintf(stderr, "dlopen() failed: %s\n", dlerror());
exit(EXIT_FAILURE);
}
/* Découvrir la taille du tampon qu'il faut passer à
RTLD_DI_SERINFO. */
if (dlinfo(handle, RTLD_DI_SERINFOSIZE, &serinfo) == -1) {
fprintf(stderr, "RTLD_DI_SERINFOSIZE a échoué : %s\n", dlerror());
exit(EXIT_FAILURE);
}
/* Allouer le tampon pour l'utiliser avec RTLD_DI_SERINFO. */
sip = malloc(serinfo.dls_size);
if (sip == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
/* Initialiser les champs 'dls_size' et 'dls_cnt' fields
dans le tampon nouvellement alloué. */
if (dlinfo(handle, RTLD_DI_SERINFOSIZE, sip) == -1) {
fprintf(stderr, "RTLD_DI_SERINFOSIZE a échoué : %s\n", dlerror());
exit(EXIT_FAILURE);
}
/* Récupérer et afficher la liste de recherche des bibliothques. */
if (dlinfo(handle, RTLD_DI_SERINFO, sip) == -1) {
fprintf(stderr, "RTLD_DI_SERINFO a échoué : %s\n", dlerror());
exit(EXIT_FAILURE);
}
for (size_t j = 0; j < serinfo.dls_cnt; j++)
printf("dls_serpath[%zu].dls_name = %s\n",
j, sip->dls_serpath[j].dls_name);
exit(EXIT_SUCCESS); }
dl_iterate_phdr(3), dladdr(3), dlerror(3), dlopen(3), dlsym(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.
5 février 2023 | Pages du manuel de Linux 6.03 |