メモリ内のアドレスでシンボル名を取得しようとしています。int dladdr(void *addr, Dl_info *info)
関数fromを使用dlfcn.h
して情報を取得します。
typedef struct { const char * dli_fname; /*共有オブジェクトのパス名 アドレスを含む*/ void * dli_fbase; /*共有オブジェクトのアドレス ロードされます*/ const char * dli_sname; /*アドレスを持つ最も近いシンボルの名前 addrより低い*/ void * dli_saddr; /*という名前のシンボルの正確なアドレス dli_snameで*/ } Dl_info;
ただし、この関数はアドレスに一致するシンボルを見つけることができず、dli_snameとsaddrをNULLに設定します。
この場合、シンボルの名前またはシンボルに関するその他の情報(種類、属性など)を取得するにはどうすればよいですか?
注:私が見つけようとしているシンボルの名前はです_ZTv0_n24_N4QGst13PropertyProbeD0Ev
。これは、クラスのvtableに次のようにリストされていQGst::PropertyProbe
ますg++ -fdump-class-hierarchy
。
QGst::PropertyProbeのVtable QGst :: PropertyProbe :: _ ZTVN4QGst13PropertyProbeE:14uエントリ ..。 80(int(*)(...))QGst :: PropertyProbe :: _ ZTv0_n24_N4QGst13PropertyProbeD1Ev ..。
しかし、シンボルdladdr
によって共有オブジェクトを調べ、仮想関数ポインターのリストを反復処理したときに取得したアドレスでは見つかりません。v-tableの他のすべての関数は、によって検出されます。dlopen
dlsym
_ZTVN4QGst13PropertyProbeE
dladdr