カーネルヘッダーに対してkgdboeを構築できません。

カーネルヘッダーに対してkgdboeを構築できません。

以下に基づいてkgdboeを構築しようとしています。地図時間。デフォルトのカーネルでは利用できないドライバが必要なため、更新されたカーネル5.9.0でUbuntu 20.04を実行しています。ヘッダー、モジュール、カーネルイメージの.debパッケージをダウンロードし、手動でインストールしてカーネルを更新しました。私のuname -r出力はです5.9.0-050900-generic。ビルドモジュールを使用しようとするとmake -C /lib/modules/$(uname -r)/build M=$(pwd)エラーが発生します。

ERROR: modpost: "__module_address" [/home/ipc/Downloads/kgdboe/kgdboe.ko] undefined!

また、GITからLinuxカーネルソースツリー全体を手動でダウンロードし、5.9.0を確認しました。完全なソースツリーへのパスを使用してmakeコマンドでこのモジュールを作成すると、モジュールが構築されます。ただし、モジュールのマジックバージョンとuname -r出力が一致しないためmodprobe -f

私の質問は、なぜLinuxヘッダーでビルドできないのかということです。モジュールを構築するためのヘッダーフォルダを準備するためのいくつかのステップがありませんか?カーネルヘッダ用にこのモジュールをビルドする方法、またはuname -r出力用のビルドモジュール(5.9.0)のバージョンマジックを更新する方法を見つけようとしています。

答え1

(編集がおかしくなってすみません)

KGBoEはLinuxカーネル> v5.7.0と互換性がありません(参照:協会)。 KGDBoEが正常に動作するためには、LinuxカーネルとKGDBoEソースコードを次のようにパッチする必要がありました。

  1. 最近のカーネルバージョンからエクスポートされていないカーネルの欠落しているシンボルを再エクスポートします。

diff --git a/kernel/kallsyms.cb/kernel/kallsyms.c

index 4fb15fa96734..4669f3cfb55b 100644
--- a/kernel/kallsyms.c

+++ b/kernel/kallsyms.c
@@ -176,6 +176,7 @@ unsigned long kallsyms_lookup_name(const char *name)
        }
        return module_kallsyms_lookup_name(name);
 }
+EXPORT_SYMBOL_GPL(kallsyms_lookup_name);
 int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
                                      unsigned long),
diff --git a/kernel/module.c b/kernel/module.c
index 1c5cff34d9f2..cd07a842bdb2 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -4517,7 +4517,7 @@ struct module *__module_address(unsigned long addr)
        }
        return mod;
 }
-
+EXPORT_SYMBOL_GPL(__module_address);
  1. 以下をコメントアウトして、KGDBoEモジュールパラメータkallsyms_lookup_name_addressを無効にします。

    kgdboe_main.c ファイルから

    //uint64_t kallsyms_lookup_name_address; //module_param(kallsyms_lookup_name_address、ullong、0444);

    static int __init kgdboe_init(void) { // if (!kallsyms_lookup_name_address) // { // printk(KERN_ERR "kgdboe: このカーネルバージョンでは、 kallsyms_lookup_name のアドレスを明示的に指定する必要があります。 'kallsyms_lookup_name_します。insmodコマンド。 'Linen');

    Tracewrapper.hファイルから:// extern uint64_t kallsyms_lookup_name_address; //#define kallsyms_lookup_name ((unsigned long(*)(const char *))kallsyms_lookup_name_address)

関連情報