警告: 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などにより「有効な」インスタンスを修正できるので、それらが存在するという事実は5月信頼感を与えない。

関連情報