Я не могу получить расширение gnu для эльфа с косвенными функциями для работы с dladdr
.Как получить имя косвенной функции gnu с помощью dladdr?
В приведенном ниже примере fabs
и sin
представлены две динамические функции в libm
, где sin
также является косвенной функцией. Глядя вверх fabs
от его указателя хорошо работает, но sin
не найден. Я пробовал различные флаги до dlopen
и -rdynamic
без успеха.
Отладчик показывает, как sin
оценивается от gnu-indirect-function variable
до __sin_avx
.
Я пропустил что-то здесь или косвенные функции, не поддерживаемые 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
}
Интересно, что удается работать, если вы удалите '-fPIC'. – yugr