我正在尝试根据以下内容构建 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 命令中使用指向完整源代码树的路径来创建此模块,则该模块将构建。但由于模块 magic 版本和 uname -r 输出不匹配,即使使用modprobe -f
.
我的问题是,为什么我不能仅使用 linux 头文件进行构建?我是否缺少一些为构建模块准备头文件夹的步骤?我正在尝试找到一种针对内核标头构建此模块的方法,或者是否可以更新构建模块(5.9.0)的版本魔法以进行uname -r
输出。
答案1
(抱歉编辑蹩脚)
KGBoE 与 Linux 内核 > v5.7.0 不兼容(请参阅关联)。我必须修补 Linux 内核和 KGDBoE 源代码才能使 KGDBoE 正常工作,如下所示:
- 再次导出内核中缺失的符号,这些符号在最近的内核版本中未导出:
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);
通过注释以下内容来禁用 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 的地址。请在 insmod 命令后附加 'kallsyms_lookup_name_address=0x...'亚麻布”); // 返回-EINVAL; // }
在文件tracewrapper.h中://extern uint64_t kallsyms_lookup_name_address; //#define kallsyms_lookup_name ((unsigned long(*)(const char *))kallsyms_lookup_name_address)