2011-09-08 9 views
5

をを.configに従って任意の効率的な方法があります(おそらくgccのプリプロセッサを乱用することによっては?)の.configに応じて必要とされないすべてのコードが省略されて取り除かカーネルソースのセットを取得するには?ストリップのLinuxカーネルソース

答えて

2

解決策をいくつか手に入れました。

まず、1は今の

make KBUILD_VERBOSE=1 | tee build.log 
grep '^ gcc' build.log 

が使用するコンパイラのコマンドを取得することができ、私は更なるステップのために一つだけのgccコマンドラインを選択します。例えば、カーネル/ 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_...がアクティブなカーネルコードを選択するために使用するマクロを定義しているので素晴らしいです。

残っているのは、grep -v '^#'を使用して、プリプロセッサーコメントと残りの#defineをautoconf.hから除外することだけです。

全体のパイプは次のようになります。

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のフィルタされたバージョンであります

質問は残る:ソースツリー全体のためにそれを行うには?実際にビルドされているが、リンクに使用されずに削除されたファイルはありますか?

0

すべてをコンパイルし、ファイルが使用されなかったかを調べるためにatimeを使用しています。それはあまり正確ではないかもしれませんが、おそらく試してみる価値があります。

+0

これは、多くの#ifdefを動作しません...文は、ソースファイル内で評価されているので、未使用のファイルとほとんど未使用のファイルがあまりにもコンパイルされます。 – dronus

+0

@dronus:それは私が考えることができる唯一の簡単な方法です(次は、基本的には、Cプリプロセッサの作成または変更です)。未使用のモジュールやアーチのようなものは取り除かなければなりません。あなたは本当にそれがより正確である必要がありますか?あなたは何を達成しようとしていますか? –

+1

私はちょうどカーネルがどのように動作するかについていくつかの推理可能な概観を得るのが好きですが、100MBのコードを読むことはほとんど不可能です。だから私は最小限のカーネルを構築し、実際に使用されているコードを読むのが好きです。 – dronus

関連する問題