dladdr
で動作する間接関数を持つelfにgnu拡張を取得できません。dladdrを使ってgnu間接関数の名前を取得する方法は?
fabs
およびsin
は、libm
の2つの動的関数です。ここで、sin
は間接関数です。ポインタからfabs
を検索するとうまく動作しますが、sin
が見つかりません。私はdlopen
と-rdynamic
への様々なフラグを試してみました。
デバッガは、gnu-indirect-function variable
__sin_avx
までからから評価する方法sin
示します。
ここに何かが見つからないか、間接機能が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