2010年05月14日
Linuxカーネルのビルドで特定のファイルのコンパイル最適化オプションを変更する
Linuxカーネルをデバッガで追っていくときに、コンパイラの最適化のためにアドレスとソースの対応づけや変数のメモリ割り当ての情報が失われてしまっていたり、インライン展開されてしまっていたりして、意図したようにデバッガが動かないことがあります。
こんなときはコンパイラの最適化を抑止する-O0(大文字のオーの後に数字のゼロ)のコンパイルオプションをつければよいのですが、全てのソースを-O0でコンパイルすると動かなくなってしまうこともあります。
そこで、特定のファイルだけのコンパイルオプションを追加する方法を紹介します。
ソースファイルのあるMakefikeに以下のような行を追加します。
CFLAGS_(オブジェクトファイル名) = コンパイルオプション
例えば、init/main.c だけに -O0 オプション を追加するには
init/Makefileに以下の行を追加します。
CFLAGS_main.o = -O0
-Oオプションは複数ついている場合には後ろにあるほうが有効になります。これで全体には-O2がついていても、これを指定したファイルだけは-O0でコンパイルすることになります。
これで意図したとおりにコンパイルオプションが追加されたかを確認するには、makeのときにV=1 をつけるのが便利です。
$ make V=1
これでmakeのときに実行される各コマンドのコマンドラインオプションが全て表示されます。