警告:modpost:10個の部分的な不一致が見つかりました。

警告: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'

ベストアンサー1

このSO Q&Aの純粋なコピーであるこの質問に対する解決策は、U&Lにも価値があります!

引用する


これは単なる警告です。カーネルビルドシステムは完全性チェックを実行し、潜在的にバグのあるコンテンツを発見しました。警告メッセージは、カーネルコードのどこかに不適切なクロスセクションアクセスを実行できるコードがあることを示します。カーネルが実際に構築されたことに注意してください!

この警告の意味を理解するには、次の例を検討してください。

カーネルテキストセクションの一部のカーネルコードは、__initリンカがカーネルに入れるデータマクロとしてマークされた関数を呼び出そうとする可能性があります。内部に開始またはモジュールのロード後に割り当てが解除されたセクション。

ランタイムエラーの可能性があります。テキスト部分呼び出しのコード内部に初期化コードが完了したら、デフォルトで古いポインタを呼び出します。

しかし、呼び出しは完全に大丈夫かもしれません。カーネルからの呼び出しは次のようになります。テキストセクションには呼び出しのみが行われることを知るのに十分な理由があります。内部に部分、存在が保証される場合。

もちろん、これは単なる例です。他の同様のシナリオが存在する。

解決策は、CONFIG_DEBUG_SECTION_MISMATCH=yどの関数がどのデータや関数にアクセスしようとしているのか、そしてどの部分が属するのかを出力するコンパイルです。その後、ビルド時間の警告が必要かどうかを判断し、その場合は修正してください。

これ初期化ファイルマクロを使用すると、これらの操作を実行__refできます。__refdata内部に予告なく参照してください。例えば、

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などは、「有効な」インスタンスを変更して、そのインスタンスが存在するという事実を修正できます。可能自信を呼び起こさない。

おすすめ記事