4

すべてのシンボルのオフセット アドレスがあります (libelf を独自のバイナリ .so で実行して取得)。ここで、実行時に、これらすべてのシンボルの絶対アドレスを計算する必要があります。そのためには、ベース アドレス (共有ライブラリが読み込まれる場所) を取得して計算を行う必要があります。

symbol_address = base_address + symbol_offset

共有ライブラリが独自のベースアドレスを取得するにはどうすればよいですか? Windows では、DllMain に渡されたパラメーターを使用しますが、Linux に同等のものはありますか?

4

2 に答える 2

7

Linuxでは、dladdr()からの任意のシンボルでlibfoo.so

  void *dli_fbase;      /* Load address of that object */

詳細はこちら

または、現在のプロセスにロードされたすべての ELF イメージのロード アドレスを指定dl_iterate_phdr できます。

どちらもGLIBC拡張子です。を使用していない場合は、使用しているものGLIBCを教えてください。より適切な回答が得られます。

于 2010-07-24T03:43:03.450 に答える
-1

いくつかの調査の後、私は、dlopen() 関数によって返されるその記述子によってロードされているライブラリのアドレスを発見する方法を見つけることができました。このようなマクロを使用して実行されます。

#define  LIBRARY_ADDRESS_BY_HANDLE(dlhandle) ((NULL == dlhandle) ? NULL :  (void*)*(size_t const*)(dlhandle))
于 2010-12-13T14:37:07.450 に答える