2005-11-03から1日間の記事一覧

読むべきヘッダ

Linux と FreeBSD と NetBSD では dlfcn.h と link.h MacOSX では dlfcn.h と mach-o/dyld.h Win32 では windows.h

関数ポインタから任意関数を呼び出す

関数の型がコンパイル時に決まるなら ( (int (*) (const char* s))0x80482cc)("hello"); とかでいい。(ちなみに puts がここにロードされてた)たぶん libffi でイケるけど Linux 以外では未確認。

ファイル名からシンボル一覧を取得する (nm相当)

ぶっちゃけ nm しておいてパーズでもいい、が…libbfd を使うのが基本。基本的には、 bfd_read_minisymbols を使ってそれで得られたものを bfd_minisymbol_to_symbol で変換するのがいいと思う。 bfd_read_minisymbols の第二引数は 0, 1 で指定するダイナミ…

起動後に共有ライブラリの名前とアドレスを取得する

最初のができるなら問題無いけど、 dlopen の返り値使えばもっと速かったりとか。 Linux と FreeBSD は dlopen の返り値を dh として、 dlinfo(dh, RTLD_DI_LINKMAP, &lmap) 。 MacOSX では、うーんよくわからない。 _dyld_* は起動時の状態しか取れないよう…

共有ライブラリをオープンする

基本は dlopen 。まぁよくやられてるのでサンプル豊富。 Linux, FreeBSD, NetBSD では dlopen 。 MacOSX では dlopen か NSAddImage(name, NSADDIMAGE_OPTION_WITH_SEARCHING) かな。 Win32 では LoadLibrary(name) ていうかまぁ、 dlsym もサンプル豊富なの…

自分のプロセスの名前を取得する

これ、案外できない。 argv[0] ですむ場合が多いんだけど。 Linux では /proc/self/exe くらいかな。 FreeBSD では dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &lmap) で自分自身も入ってくる。 MacOSX は _dyld_* で自分自身も入ってくる。 Win32 では GetModuleH…

共有ライブラリの名前とロードされたアドレスを取得する (実行時 ldd 相当)

ldd と違ってどのアドレスにロードされているかの情報も欲しい。 Linux だと /proc/self/maps に書いてある情報。 Linux では dl_iterate_phdr でにコールバック関数を渡してやる。 FreeBSD では dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &lmap) などとして link…

実行時に情報を調べる話のまとめ

このへんの話もーちょい調べたら今度まとめてみたいなとか思うけど何がわかってないのか混乱してきたから、現状のまとめ。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h