Je ne peux pas obtenir l'extension gnu à elf avec des fonctions indirectes pour travailler avec dladdr
.Comment obtenir le nom de la fonction indirecte gnu en utilisant dladdr?
Dans l'exemple ci-dessous fabs
et sin
sont deux fonctions dynamiques dans libm
, où sin
est également une fonction indirecte. En levant fabs
de son pointeur fonctionne bien, mais sin
est introuvable. J'ai essayé divers drapeaux à dlopen
et -rdynamic
sans succès.
Le débogueur montre comment sin
est évalué à partir d'un gnu-indirect-function variable
à __sin_avx
.
Ai-je manqué quelque chose ici ou est-ce que les fonctions indirectes ne sont pas supportées par dladdr
?
/*
compiled with g++-5 -fPIC -ldl
*/
#include <cmath>
#include <dlfcn.h>
#include <iostream>
char const * name (void * arg)
{
void * h = dlopen (NULL, RTLD_LAZY);
if (h)
{
Dl_info res;
int status = dladdr (arg, & res);
dlclose (h);
if (status && res.dli_sname && arg == res.dli_saddr)
return res.dli_sname;
}
return "";
}
int main()
{
std::cout << fabs (0.0) << " " << name ((void *) fabs) << std::endl; // found
std::cout << sin (0.0) << " " << name ((void *) sin) << std::endl; // not found
}
Intéressant, réussit à fonctionner si vous supprimez '-fPIC'. – yugr