Renvoi d’une table de symboles de bibliothèque partagée

Par exemple:

void* sdl_library = dlopen("libSDL.so", RTLD_LAZY); void* initializer = dlsym(sdl_library,"SDL_Init"); 

En supposant qu’il n’y ait pas d’erreur, l’initialiseur pointera vers la fonction SD_Init dans la bibliothèque partagée libSDK.so.

Cependant, cela nécessite de savoir que le symbole “SDL_Init” existe.

Est-il possible d’interroger une bibliothèque pour tous ses symboles? Par exemple, dans ce cas, SDL_Init, le pointeur de la fonction et tous les autres symboles exportés par libSDL.so seront renvoyés.

    Il n’y a pas de fonction libc pour faire ça. Cependant, vous pouvez en écrire un vous-même (bien que le code soit quelque peu impliqué).

    Sous Linux, dlopen() renvoie en fait l’adresse d’une structure link_map , dont le membre nommé l_addr pointe vers l’adresse de base de l’object partagé chargé (en supposant que votre système n’exerce pas au hasard le placement de la bibliothèque partagée et pas été pré-lié).

    Sous Linux, un moyen sûr de trouver l’adresse de base (l’adresse de Elf*_Ehdr ) consiste à utiliser dl_iterate_phdr() après dlopen() la bibliothèque.

    Avec l’en-tête ELF, vous devriez pouvoir parcourir une liste de symboles exportés (la table des symboles dynamics), en localisant d’abord Elf*_Phdr de type PT_DYNAMIC , puis en localisant les entrées PT_DYNAMIC , PT_DYNAMIC , puis en DT_SYMTAB itération sur tous les symboles du DT_SYMTAB . table de symbole dynamic. Utilisez /usr/include/elf.h pour vous guider.

    De plus, vous pouvez utiliser libelf , mais je suis incapable de vous guider car je n’ai aucune expérience en la matière.

    Notez enfin que l’exercice est un peu futile: vous obtiendrez une liste de fonctions définies, mais vous ne saurez pas comment les appeler (quels parameters sont attendus), alors à quoi ça sert?

    Je ne pense pas qu’il existe une API publiée pour cela. Vous pouvez utiliser l’outil nm de binutils ou examiner son code source: http://sourceware.org/cgi-bin/cvsweb.cgi/src/binutils/?cvsroot=src

    http://sourceware.org/cgi-bin/cvsweb.cgi/src/binutils/nm.c?rev=1.63&content-type=text/x-cvsweb-markup&cvsroot=src

    (en supposant évidemment elfe)

    La commande linux nm peut être utilisée: http://man.yolinux.com/cgi-bin/man2html?cgi_command=nm

     void *dlsym(void *ressortingct handle, const char *ressortingct name); 

    Valeur de retour

    Si handle ne fait pas référence à un object valide ouvert par dlopen () , ou si le symbole nommé ne peut être trouvé dans aucun des objects associés à handle , dlsym () doit renvoyer NULL. Des informations de diagnostic plus détaillées doivent être disponibles via dlerror () .

    (Source: http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html )

    En d’autres termes, si le symbole n’est pas trouvé, dlsym() retournera NULL . Je ne sais pas si c’est ce que vous cherchez, mais c’est le moyen le plus simple que je puisse trouver.