2012年10月18日木曜日

関数の入口出口で関数を呼ぶには

gcc でコンパイルする場合、関数の入口と出口で別の関数を呼ぶことができる。
まず、コンパイル時に -finstrument-functions を付けて、コンパイルしておく。
すると、各関数の入口と出口で

void __cyg_profile_func_enter(void* func_addr, void* call_site);
void __cyg_profile_func_exit(void* func_addr, void* call_site);
が呼ばれるので、これらの関数を共有ライブラリとして用意しておいて使う。

2012年10月17日水曜日

あるカーネルモジュールで定義したグローバル変数を別のモジュールから参照する

あるカーネルモジュールで定義したグローバル変数を別のモジュールから参照する。

まず、最初のカーネルモジュール A で外部に見せたい変数を EXPORT_SYMBOL() で囲む。
次に、別のカーネルモジュール B で、その変数を参照するわけだが、これで通常のコンパイルをすると、その変数は undefined だと言われる。

これを解決するためには、カーネルモジュール B をコンパイルする際に、
make -C ... M=... KBUILD_EXTRA_SYMBOLS=<path>/Module.symvers modules
のように、KBUILD_EXTRA_SYMBOLS にモジュール A の Modules.symvers のパスを指定するとうまくいく。