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 しておいてパーズでもいい、が…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 と違ってどのアドレスにロードされているかの情報も欲しい。 Linux だと /proc/self/maps に書いてある情報。 Linux では dl_iterate_phdr でにコールバック関数を渡してやる。 FreeBSD では dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &lmap) などとして link…
このへんの話もーちょい調べたら今度まとめてみたいなとか思うけど何がわかってないのか混乱してきたから、現状のまとめ。