このエラーメッセージは私が心配すべきものですか?
linux-y3pi:/usr/src/linux-2.6.38.8 # make modules
scripts/kconfig/conf --silentoldconfig Kconfig
CHK include/linux/version.h
CHK include/generated/utsrelease.h
CALL scripts/checksyscalls.sh
Building modules, stage 2.
MODPOST 2516 modules
***WARNING: modpost: Found 10 section mismatch(es).***
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
これからの純粋なコピーSO Q&A、この質問の解決策はU&Lにとっても価値があります!
これは単なる警告です。カーネルビルドシステムはサニティチェックを行い、エラーの可能性があるものを見つけました。警告メッセージは、カーネルコードのどこかに、不適切な断面アクセスを行う可能性のあるコードがあることを示しています。カーネルがビルドされたことに注意してください!
警告の意味を理解するには、次の例を検討してください。
カーネルテキストセクションの一部のカーネルコードは、__init
データマクロでマークされた関数を呼び出そうとしている可能性があります。これは、リンカーがカーネルinitセクションに配置してdeを取得します。 -ブートまたはモジュールのロード後に割り当てられます。
textセクションのコードが初期化コードの後にinitセクションのコードを呼び出す場合、これは実行時エラーである可能性があります終了しました、それは基本的に古いポインタを呼び出しています。
そうは言っても、その呼び出しは完全に問題ないかもしれません-カーネルtextセクションの呼び出しには、initセクションが存在することが保証されている場合。
もちろん、これはほんの一例です。同様の他のシナリオも存在します。
解決策は、CONFIG_DEBUG_SECTION_MISMATCH=y
を使用してコンパイルすることです。これにより、どの関数がどのデータまたは関数にアクセスしようとしているか、およびそれらがどのセクションに属しているかが出力されます。次に、ビルド時の警告が必要かどうかを判断し、必要に応じて修正することができます。
init.h マクロ__ref
および__refdata
を使用して、警告なしでそのようなinit参照を許可できます。例えば、
char * __init_refok bar(void)
{
static int flag = 0;
static char* rval = NULL;
if(!flag) {
flag = 1;
rval = init_fn(); /* a function discarded after init */
}
return rval;
}
__init_refok
などは「有効な」インスタンスを修正できるため、それらが存在するという事実は自信を刺激しない可能性があります。