Kernel
嘗試編譯核心模組時出錯
我正在關注有關如何在 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
)。教程頁面可以在這裡找到。
似乎 和 的定義
_ASM_EXTABLE_HANDLE
包含ex_handler_rdmsr_unsafe
在 linux headers4.15.0-72-generic
中。以前我使用 linux headers 執行 Ubuntu 16.04 LTS4.4.0-81-generic
。升級到 Ubuntu 18.04 LTS(也將 linux 標頭檔升級到4.15.0-72-generic
)解決了這個問題。