關於Linux核心編譯 CONFIG_MODVERSIONS 作用的兩篇文章整理。
一般情況下,如果沒有選擇CONFIG_MODVERSIONS,這些符號是正常的字串;如果選擇了CONFIG_MODVERSIONS,這些符號就會在後面加一段校正字串。這樣做的目的是避免模組不正確載入情況下,使得Linux核心崩潰。
一、
如果核心選擇了CONFIG_MODVERSIONS選項,你的模組的Makefile要增加以下幾行
CFLAGS += -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h
或者在你的C源檔案裡增加
#ifdef CONFIG_MODVERSIONS
#define MODVERSIONS
#include <linux/modversions.h>
#endif
這樣就可以在編譯核心模組時,如果模組裡引用了核心符號表,就可以自動計算校正字串,而不會在載入模組時出現unresloved symbol的錯誤了。
二、
但是當你的核心在編譯時間使能了CONFIG_MODVERSIONS選項,那麼你插入的模組可以是一下兩種情況:
1,編譯時間沒有帶CONFIG_MODVERSIONS選項,但版本必須與核心的版本一致;
2,編譯時間如果帶有CONFIG_MODVERSIONS選項,那麼模組的版本將沒有限制;
而通常核心在編譯是帶有CONFIG_MODVERSIONS選項的,所以就出現了文章開頭出現的情況:核心和模組的版本不一致。同時我們也就找到了相應的解決辦法--在模組編譯時間選擇CONFIG_MODVERSIONS選項,這樣我們就可以解決版本不匹配的問題了。
我們需要這源檔案(c檔案)中加上下面的宏定義:
#ifdef CONFIG_MODULES
#ifdef CONFIG_MODVERSIONS
#MODFLAGS += -DMODVERSIONS -include $(HPATH)/linux/modversions.h
#endif
#endif
然後編譯就可以了。