Win32 と同じ:
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)(void*)(myFunc), &h);
http://www.kernel.org/doc/man-pages/online/pages/man3/dlsym.3.htmlは役に立ちません。
Win32 と同じ:
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)(void*)(myFunc), &h);
http://www.kernel.org/doc/man-pages/online/pages/man3/dlsym.3.htmlは役に立ちません。
を使用しdladdr
ます。ドキュメンテーションはこちら。
私が知っている唯一の方法は、/proc/self/maps
(および/またはおそらくsmaps
)の内容を解析し、シンボルアドレスを使用して、関数が存在するマップされたモジュールの境界.so
(開始とそのサイズ)から計算することです。
注:は、現在のプロセスの(IDを持つ)メタ情報/proc/self
への(Linuxの)シンボリックリンクです。<pid>
/proc/<pid>
使用できるこの情報へのプログラミングインターフェイスがある可能性があります。
編集:ああ、dladdr()
そのインターフェースもそうでしょう。
それ自体ではありません。dlopen()
シンボルが/経由でアクセスされる代わりにコンパイルされた場合、dlsym()
返されるハンドルはありません。(ハンドルの抽象化はdlsym()
、シンボルをロードする場所を細かく制御できるようにするためだけに存在します。リンカー スクリプトを介する場合を除いて、元のリンクに対するそのような制御はありません。) イベントの通常の過程では、オブジェクトは単純にopen()
ed およびmmap()
ed であり、その他の詳細は次のとおりです。内に隠され、および へのパラメータをld.so
介して間接的にのみアクセスできます。を使用している場合は、ハンドルを追跡する必要があります。RTLD_DEFAULT
RTLD_NEXT
dlsym()
dlopen()