私が知る限りモジュール.symversファイルはエクスポートされたシンボルのリストを提供します。モジュール別ライセンスとともに、これらのファイルはCRC(オプション)に従ってエクスポートできます。他のモジュールは目的を達成するためにこれらのシンボルに依存する可能性があり、私のモジュールがいくつかのシンボルに依存している場合は確かに論理的です。モジュールX、これモジュールX少なくとも建設されるべきだから定義シンボルが必要です。モジュール.symversだからそれは完全なチェックで動作します。そうですか?
いくつかのシンボルがなぜ使用されるのか理解するのは難しいです。明らかにdebugfs_create_u32
エクスポートされていないモジュールに依存しません。たとえば、関数を使用したいと思います。存在しなければならない唯一の依存関係ですが、CONFIG_DEBUG_FS
このオプションを有効にすると、宣言されたシンボルの小さな部分のみをエクスポートできます#include <linux/debugfs.h>
。そのため、モジュールをコンパイルしようとするたびに、未定義のシンボルに対してMODPOSTエラーが発生します。私の解決策は、debugfs_create_u32
コード内で実際にシンボルを使用する任意のモジュールを見つけてカーネルをコンパイルすることでした。モジュールには定義がなく、debugfs_create_u32
モジュールの機能を使用せず、実際には必要ありません。このモジュールが私に役立つ唯一のことは、次の行を追加するだけです。モジュール.symversファイルとすべてが魔法のように動作し始めました。私はシンボルに似た問題があり、モジュールがi8253_lock
必要ではなく、ほしいだけpcspkr
でしたが、i8253_lock
それを取得するにはpcspkr
何らかの理由でコンパイルする必要がありました。
ここで重要なことを見逃しているのが確かであまりにも混乱しているので、上記の状況をどのように理解すべきか、世代の論理は何なのかについての説明をお願いします。モジュール.symvers?
答え1
まだこの問題で苦労しているのか分からない。少し遅れていることはわかりましたが、今夜も同じ問題が発生しました。犯人はカーネル構成の次のオプションです。
CONFIG_TRIM_UNUSED_KSYMS
https://cateee.net/lkddb/web-lkddb/TRIM_UNUSED_KSYMS.html
このオプションが有効な場合は無効にします。
お役に立てば幸いです。