檜山正幸のキマイラ飼育記 このページをアンテナに追加 RSSフィード Twitter

キマイラ・サイトは http://www.chimaira.org/です。
トラックバック/コメントは日付を気にせずにどうぞ。
連絡は hiyama{at}chimaira{dot}org へ。
蒸し返し歓迎!
このブログの更新は、Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama
ところで、アーカイブってけっこう便利ですよ。

2008-09-26 (金)

コードのアドレスを知る方法

| 10:28 | コードのアドレスを知る方法を含むブックマーク

「もっとえぐいトリックはないものか?」の要点は、「Cから、特定コードのアドレスをどうやって知るか?」てことです。

  1. 名前が付いた関数の入り口は &func で取れる。
  2. gccなら &&label としてラベルのアドレスが取れる。
  3. スタックフレームの構造が分かっていれば、戻り番地を取れる。

いつでも使えるのは(1)だけ、(2)はコンパイラ依存だけどハードウェアには依存しないでしょう。(3)は環境ごとに変わってしまいますし、いつでも可能である保証もありません*1

僕が、他に「ないものか?」と思ったのは、コードのアドレスを知る第四の方法のことです。インラインアセンブラは反則。大域ジャンプはsetjmp/longjmpでも出来るけど、これはトリックじゃないしね。知ってもそれを使う予定は何もないし、知っていいことも別にありませんけどね(苦笑)。

*1:例えば、MIPS風Jump and Link命令でコールして、呼ばれた側がリンクレジスタの保存は行わずに、リンクレジスタを使ったジャンプで戻るとき、Cからリンクレジスタは見えないでしょう。

shiroshiro 2008/09/26 10:49 単なる思いつきで試していませんが、SA_SIGINFOフラグつきでシグナルハンドラをsigactionで設定し、SIGFPEを起こすようなコードを仕込んでおくと、シグナルハンドラのsiginfo_t *si_addrフィールドにそのコードのアドレスが得られる、ように思います。
ただ、どのコードがSIGFPEを起こすかの初期設定はOSやランタイムによって違ったりするので、可搬性にはやっぱり問題がありますね。

m-hiyamam-hiyama 2008/09/26 12:38 shiroさん、
なるほど、OSにアドレスを知らせてもらうわけですね。えぐみは強いですが、使うのがちょっと面倒そう。

トラックバック - http://d.hatena.ne.jp/m-hiyama/20080926