プロファイラ指定(gccの-pgオプション)による関数コールのサンプル

■ 概要

gccでプロファイラ利用のために-pgオプションを指定すると, 関数の先頭に mcount (.mcount だったり _mcount だったりすることもあるようです) という関数コールが挿入されます.
通常はgcc側(っていうかおそらくリンカ)で mcount の本体が挿入され,その中ではプロファイラのための統計の 保存などが行われるのだと思われます.
が,mcount を上書きすれば,任意の関数の呼び出しを,自動で関数の先頭に 追加することができることになります.

progtool-Debian8-20170109.ova の環境 でビルド済みのサンプルです.Linux/x86 の環境で動作します.
呼び出し関数が .mcount になったりする場合があり,ドットを含む関数は C言語では定義できないため,いったんアセンブラの関数を呼び出して, そこからさらに処理関数を呼び出す構成にしています.
アセンブラ部がx86/32ビット環境に依存しているため,それ以外の環境では おそらく動作しません.
ビルド環境によって mcount が .mcount や _mcount になったりする場合があるため, 再ビルドすると動作しなくなったりするかもしれません.