尝试编译内核模块时出错

尝试编译内核模块时出错

我正在关注有关如何在 x86 架构上启用 VMX 操作的在线教程。本教程已将过程分解为多个步骤,并将所有部分组装到内核模块中的代码发布。它还提供了一个 Makefile 来编译它。两个都可以看这里。编译时我收到以下错误:

make -C /lib/modules/4.4.0-81-generic/build M=/home/sbhtwr/Desktop/hypervisor modules EXTRA_CFLAGS="-g -DDEBUG"
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-81-generic'
  CC [M]  /home/sbhtwr/Desktop/hypervisor/vmx.o
/home/sbhtwr/Desktop/hypervisor/vmx.c: In function ‘__rdmsr1’:
/home/sbhtwr/Desktop/hypervisor/vmx.c:82:8: error: expected ‘:’ or ‘)’ before ‘_ASM_EXTABLE_HANDLE’
        _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_rdmsr_unsafe)
        ^
/home/sbhtwr/Desktop/hypervisor/vmx.c:82:28: error: invalid suffix "b" on integer constant
        _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_rdmsr_unsafe)
                            ^
/home/sbhtwr/Desktop/hypervisor/vmx.c:82:32: error: invalid suffix "b" on integer constant
        _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_rdmsr_unsafe)
                                ^
scripts/Makefile.build:264: recipe for target '/home/sbhtwr/Desktop/hypervisor/vmx.o' failed
make[2]: *** [/home/sbhtwr/Desktop/hypervisor/vmx.o] Error 1
Makefile:1420: recipe for target '_module_/home/sbhtwr/Desktop/hypervisor' failed
make[1]: *** [_module_/home/sbhtwr/Desktop/hypervisor] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-81-generic'
Makefile:6: recipe for target 'modules' failed
make: *** [modules] Error 2

我无法解决该错误。我觉得我的 linux 头文件副本中缺少一些定义(尽管编译器没有明确指出这是原因!)。但我也许错了。请参见笔记以下。

笔记:我尝试在线搜索 linux 存储库上的头文件来查找 的定义,_ASM_EXTABLE_HANDLE并找到了它这里。然后我尝试在本地的 Linux 标头副本中查找asm.h,发现定义丢失了。所以我将定义复制粘贴到模块中并重新编译它。这次没有错误,但有警告:

WARNING: "ex_handler_rdmsr_unsafe" [/home/sbhtwr/Desktop/hypervisor/vmx.ko] undefined!

我找到了定义ex_handler_rdmsr_unsafe 这里。因此,我将函数的定义复制粘贴到模块中,这导致了更多错误,表明缺少函数定义(在 中使用ex_handler_rdmsr_unsafe)。

可以找到教程页面这里

答案1

看来 和 的定义_ASM_EXTABLE_HANDLE包含ex_handler_rdmsr_unsafe在 linux headers 中4.15.0-72-generic。之前我运行的是带有 linux headers 的 Ubuntu 16.04 LTS 4.4.0-81-generic。升级到 Ubuntu 18.04 LTS(同时将 linux 标头升级到4.15.0-72-generic)解决了该问题。

相关内容