2

メモリ内のアドレスでシンボル名を取得しようとしています。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の他のすべての関数は、によって検出されます。dlopendlsym_ZTVN4QGst13PropertyProbeEdladdr

4

2 に答える 2

3

メモリ内のアドレスでシンボル名を取得しようとしています。

何のために?

私はint dladdr()を使用しています...

最初に理解する必要があるのは、静的シンボル テーブルよりもはるかに小さいことが多い ELF イメージの動的dladdrシンボル テーブルのみを調べることです。でダイナミックシンボルテーブルの内容を見ることができます。nm -D

たとえば、またはフラグa.outなしで実行可能ファイルをリンクすると、 はダイナミック シンボル テーブルに表示されないため、.-Wl,-E-rdynamicmaindladdr

次に知っておくべきことは、共有ライブラリをリンクするときに、共有ライブラリからエクスポートするシンボルとエクスポートしないシンボルを正確に制御できることです (エクスポートされたシンボルは、動的なシンボル テーブル エントリを持つシンボルです)。これを行うには、さまざまな方法があります: リンカー バージョン スクリプト、-fvisibilityフラグ、attribute((visibility(...))).

つまり、dladdr何も語れないシンボルを見つけても、まったく驚くべきことではありません。

于 2013-03-18T04:15:10.027 に答える
0

試してみてくださいobjdump --syms。これにより、(マングルされた) シンボル名とそのアドレスが出力されます。http://linux.die.net/man/1/objdumpを参照してください。

于 2013-03-14T14:21:51.197 に答える