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

ぶっちゃけ nm しておいてパーズでもいい、が…

libbfd を使うのが基本。基本的には、 bfd_read_minisymbols を使ってそれで得られたものを bfd_minisymbol_to_symbol で変換するのがいいと思う。 bfd_read_minisymbols の第二引数は 0, 1 で指定するダイナミックシンボルを見るか否か。基本的には片方がゼロ個ならもう一方を読めばまず取得できると思う。ところで strip した共有ライブラリから nm -D でシンボル取得できるって知らんかったです…

また、 bfd_get_symtab_upper_bound, bfd_canonicalize_symtab, bfd_get_dynamic_symtab_upper_bound, bfd_canonicalize_dynamic_symtab を使う手もある。速度差はほとんどないように見える、うちのマシン (Celeron 1.7GHz, linux-2.6.11-mm4, glibc-2.3.5) ではシンボルが 8514個ある libkdecore.so を 100 回読んでどっちも 0.6秒くらいで、 0.02秒とかそのくらい minisymbol のやり方の方が速かった。 Win32 でのみ後者が速かった。んで前者の方が省メモリ。

  • Linux, FreeBSD, NetBSD, MacOSX, Win32 ともに基本的に前者のやり方でいい。
  • MacOSX で後者をやると mach-o.c の中で謎の assertion failure が出る。たぶん libbfd のバグを踏んでいる。また、 dynamic 系は常に失敗する。 OSX 標準添付の nm に -D が無いあたりとも関係ありそう。詳しくはTODO。
  • Win32 で dynamic 系をやると返って来なくなる。(但しWINE)

まとめると、 minisymbol 系を使った方がたぶん無難。 Linux, FreeBSD では dynamicバージョンと通常バージョン両方やってみると良い。 MacOSXWin32 では通常バージョンのみが良いと思う。

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