.config に従って不要なすべてのコードが省略された一連のストリップされたカーネル ソースを取得する効率的な方法はありますか (gcc プリプロセッサを悪用することでしょうか?)。
3 に答える
解決策にいくつかのステップがあります。
まず、使用されているコンパイラコマンドを次の方法で取得できます。
make KBUILD_VERBOSE=1 | tee build.log
grep '^ gcc' build.log
今のところ、次の手順のために1つのgccコマンドラインのみを選択します。たとえば、kernel / kmod.cのビルドは、次のようになります。
gcc <LIST OF MANY OPTIONS> -c -o kernel/kmod.o kernel/kmod.c
-c
ここで、オプションを削除して-o ...
追加します。これにより-E
、コンパイルが無効になり、プリプロセッサ出力が画面に書き込まれます。-fdirectives-only
さらに、マクロの拡張を防ぎ-undef
、GNUで定義されたマクロ定義を削除するために追加します。-nostdinc
標準のcヘッダーを削除するには、カーネルのmakefileによってすでに追加されています。
現在、インクルードはまだ含まれているため、プリプロセッサ出力で拡張されます。したがって、入力ファイルをgrepにパイプして、それらを削除しますgrep -v '#include' kernel/kmod.c
。これで、インクルードは1つだけ残ります。autoconf.hはMakefileのコマンドラインにインクルードされます。#ifdef CONFIG_...
これは、アクティブなカーネルコードを選択するために使用されるマクロを実際に定義するので素晴らしいです。
#define
残っているのは、プリプロセッサのコメントと残りのsをautoconf.hから。を使用して除外することだけですgrep -v '^#'
。
パイプ全体は次のようになります。
grep -v '#include' kernel/kmod.c | gcc -E -fdirectives-only -undef <ORIGINAL KERNEL BUILD GCC OPTIONS WITHOUT -c AND -o ...> - |grep -v '^#'
その結果、実際にkmod.oに組み込まれているコードを含むカーネル/kmod.cのフィルター処理されたバージョンが作成されます。
疑問が残ります:ソースツリー全体に対してそれを行う方法は?実際にはビルドされているが、リンク時に使用および削除されていないファイルはありますか?
すべてをコンパイルし、atime を使用して、使用されていないファイルを見つけます。あまり正確ではないかもしれませんが、おそらく試してみる価値があります。