| dlinfo(3) | Library Functions Manual | dlinfo(3) |
dlinfo - Obtenir des informations sur un objet chargé dynamiquement
Bibliothèque de liens dynamiques (libc, -lc)
#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).
Pour une explication des termes utilisés dans cette section, consulter attributes(7).
| Interface | Attribut | Valeur |
| dlinfo() | Sécurité des threads | MT-Safe |
Les ensembles de requêtes prises en charge par les diverses implémentations ne se recouvrent que partiellement.
GNU.
glibc 2.3.3. Solaris.
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, "Utilisation : %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 failed: %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'
dans le tampon nouvellement alloué. */
if (dlinfo(handle, RTLD_DI_SERINFOSIZE, sip) == -1) {
fprintf(stderr, "RTLD_DI_SERINFOSIZE failed: %s\n", dlerror());
exit(EXIT_FAILURE);
}
/* Récupérer et afficher la liste de recherche des bibliothèques. */
if (dlinfo(handle, RTLD_DI_SERINFO, sip) == -1) {
fprintf(stderr, "RTLD_DI_SERINFO failed: %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.
| 15 juin 2024 | Pages du manuel de Linux 6.9.1 |