組み込みシステム用のカーネルとモジュールの構築に問題があります。生成されたModule.symversには、無効な(0x00000000)CRCエントリを含むいくつかの(数十)エントリがあります。
問題のあるアイテムのデバッグを開始できるように、Module.symversを生成するプロセスを理解しようとしています。しかし、数時間のビルドプロセスを見た後でも、まだ何を理解していません。生産するmodule.symvers.
注 - 「モジュールの作成」のガイドラインではなく、実際にModule.symversの内容を生成するコードを探しています;-)
GCC 6.3 を使用して Linux 3.4.12 をビルドすると破損が発生したと思われますが、その構成を使用するにはそれをインポートする必要があります。サードパーティのバイナリBLOBモジュールをロードする必要があるため、Modversを無効にすることはオプションではありません。
答え1
このファイルModule.symvers
はscripts/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/modpost
。scripts/modposts
ターゲットファイルを解析しModule.symvers
、 。