このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

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

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

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

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

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

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