Module.symversはどのように生成されますか?

Module.symversはどのように生成されますか?

組み込みシステム用のカーネルとモジュールの構築に問題があります。生成されたModule.symversには、無効な(0x00000000)CRCエントリを含むいくつかの(数十)エントリがあります。

問題のあるアイテムのデバッグを開始できるように、Module.symversを生成するプロセスを理解しようとしています。しかし、数時間のビルドプロセスを見た後でも、まだ何を理解していません。生産するmodule.symvers.

注 - 「モジュールの作成」のガイドラインではなく、実際にModule.symversの内容を生成するコードを探しています;-)

GCC 6.3 を使用して Linux 3.4.12 をビルドすると破損が発生したと思われますが、その構成を使用するにはそれをインポートする必要があります。サードパーティのバイナリBLOBモジュールをロードする必要があるため、Modversを無効にすることはオプションではありません。

答え1

このファイルModule.symversscripts/modpost。最初にコメントを見てくださいMakefile.modpost、真ん中の人々ビルドファイル。ビルドとプログラム自体modpost.cこれはoptionsを使用して実行されます-m -i

を使用すると、使用中make modules KBUILD_VERBOSE=1のコマンドを表示できます。

答え2

作成にはModule.symversいくつかの手順があります。このステップでは、インクルードファイルMODVERDIR(通常は.tmp_versionsビルドディレクトリにあります)を利用します。.mod

モジュールをコンパイルして.oファイルを生成した後、ソースコードはCプリプロセッサを介してプッシュされ、-D__GENKSYMS__結果の出力は独自の(比較的単純な)コードパーサをscripts/genksyms実装genksymsしてシンボル署名と対応するCRCを生成するようにパイプされます。genksymsカーネル3.4でgcc 6.3を使用しているときにソースコードが正しく解析されないのは、このパーサーの制限です。 (カーネル4.12をバックポートして問題を解決しましたgenksyms。)すべてのシンボルCRCを含むファイルがgenksyms各モジュールに対して生成されます。次にコンパイルしてファイルを.mod.c生成します。.mod.o

最後のステップには、モジュール内のすべての*.modファイルを解析しMODVERDIR、モジュールを構成するすべてのファイルを確認し、その.koファイル.mod.oのリストを一緒にvmlinux渡すことが含まれますscripts/modpostscripts/modpostsターゲットファイルを解析しModule.symvers、 。

関連情報