2005-11-01から1ヶ月間の記事一覧

しー言語たぶん最後

http://shinh.skr.jp/koneta/#shelang思いの他がんばった。対応 OS が Linux, FreeBSD, Solaris, NetBSD, MacOSX, Windows 。 Winバイナリ入り。 ./she.exe test.she や ./she.exe test_sdl.exe などと。たぶんいずれまとめるけど、前回 (http://d.hatena.ne…

読むべきヘッダ

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…

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

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

あ、 FreeBSD で完動した。 dlinfo の引数として RTLD_SELF ってのが FreeBSD にはある。アップロードずみ。あと Linux には dl_iterate_phdr とかいう関数があるなぁ…

dlinfo

http://shinh.skr.jp/koneta/#shelang/proc/self/maps 見るとかしなくてもポータブルにできるみたい。 dladdr 見てて、これは関数のアドレスが何か一つ無きゃダメってのがキツいなと思ってたんですが、よく見ると dlinfo という関数がヘッダ内にあるわけでし…

……面倒になったのでコードはって終わり。 #include <ffi.h> ffi_type *get_ffi_type(reflection_type_t type) { switch (type) { case R_CHAR: return &ffi_type_sint8; case R_INT: return &ffi_type_sint32; case R_FLOAT: return &ffi_type_float; case R_PTR: r</ffi.h>…

インストールは gcc-core と gcc-java を散らかして、 gcc-x.x.x/libffi 内で、 $ mkdir obj $ cd obj $ ../configure; make; sudo make installとかすると単体で入っていい感じです。 include/ffitarget.h はインストールされてくれないので手動でコピーし…

libffi

http://shinh.skr.jp/koneta/#shelang更新しないと思ってたけど更新しました。http://d.hatena.ne.jp/shinichiro_h/20051027#1130351251の続きです。 libffi を紹介していただいたので使ってみました。生成されていた 7400行とかあった dispatch.c が完全に…

mod_estraier-0.3.0

http://modestraier.sourceforge.net/http://prdownloads.sourceforge.net/modestraier/mod_estraier-0.3.0.tar.gz?downloadmod_estraier_cache を作ってみたがこの程度の再生能力ではわりとイマイチ。http://shinh.skr.jp/tmp/mod_estraier_cache.html後は …

libbfd

あー。http://shinh.skr.jp/koneta/#shelangシンボルが消された .so 内のロード、あっさりできた。 readelf とか見てたけどそんなこと以前に bfd_*dynamic_symtab* シリーズを使えばオッケー。これならシンボル情報を dynamic セクションから読むってことで…

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