web-dev-qa-db-ja.com

警告:modpost:10個のセクションの不一致が見つかりました

このエラーメッセージは私が心配すべきものですか?

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'
6
Aquarius_Girl

これからの純粋なコピー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などは「有効な」インスタンスを修正できるため、それらが存在するという事実自信を刺激しない可能性があります。

1
slm