2017-03-22 9 views
5

この質問はLinuxカーネル4.10に関するものです。ロード可能なカーネルモジュールをin-treeとしてマークする

module: loading out-of-tree module taints kernel.

これはmodule.cには、このチェックから発生します:それは「というintree縫い目get_modinfoを読む if (!get_modinfo(info, "intree")) {

外の木LKMが警告を印刷するカーネルの原因をロード

"は.koファイル内の魔法の文字列livnigです。私は私のシステムで見つかったランダムLKMにreadelfを実行

はこれを示しています

readelf -a imon.ko | grep intree 161: 00000000000006c0 9 OBJECT LOCAL DEFAULT 13 __UNIQUE_ID_intree1

シンプル、カスタムhello_worldのLKMにintreeを探している間は結果を返しません。

これは実際のケースですか?

一部のモジュールはどのようにツリー内にマークされていますか?モジュールにマクロを追加する(MODULE_LICENCEのように)か、モジュールを特定の方法でビルドするか、何か他の方法でビルドしますか?要するに

+0

なぜアウトオブツリーモジュールをインツリーとしてマークしたいのですか?これはカーネル開発者を悩ませることです。 – duskwuff

答えて

4

、ビルドシステムがあれば、「モジュール名 .mod.c」ファイルに行MODULE_INFO(intree, "Y");を追加するcontrivesとモジュールがintreeを構築されている場合のみ。

あなたのモジュールの通常の ".c"ファイルの1つにその行を追加することで、システムをだますことができますが、なぜそうしたいのか分かりません。

長いバージョン....

外部モジュールは、通常、このようなコマンドを使用して構築されています

$ make M=`pwd` modules 

または古い構文:

$ make SUBDIRS=`pwd` modules 

以外の存在を-empty MまたはSUBDIRSは、カーネルの最上位の "Makefile"にKBUILD_EXTMOD変数を設定させます。通常のカーネルビルドには設定されません。

モジュールビルドのステージ2(「ビルドモジュール、ステージ2」というメッセージが出力されている場合)では、makeは「scripts/Makefile.modpost」メイクファイルを実行します。 KBUILD_EXTMODが設定されている場合、異なるオプションでscripts/mod/modpostが実行されます。特に、KBUILD_EXTMODが設定されている場合、-Iオプションが使用されます。

「スクリプト/ MOD/modpost.c」でmodpostのソースを見ると、external_module変数が0の初期値を持っていますが、-Iオプションが機能add_intree_flag()が二番目のパラメータis_intreeと呼ばれ、これを1に設定し、​​に設定します。 add_intree_flag()関数は、is_intreeパラメータがtrueの場合に限り、MODULE_INFO(intree, "Y");を「modulename .mod.c」ファイルに書き込みます。

intreeモジュールと外部モジュールの違いは、「modulename .mod.c」ファイルにMODULE_INFO(intree, "Y");マクロコールが存在することです。これは "modulename.mod.o"にコンパイルされ、モジュールの他のオブジェクトファイルにリンクされ、 "modulename .ko"ファイルを形成します。

関連する問題