Linux 2.6.x 核心模組載入錯誤 “Invalid module format” 解決辦法

來源:互聯網
上載者:User
參考URL: http://blog.csdn.net/pottichu/archive/2007/11/19/1892203.aspx

環境: vmware + fedora8;
             gcc version 4.1.2 20070925 (Red Hat 4.1.2-33);
             kernel source 用 kernel-2.6.23.1-42.fc8.src.rpm安裝;
             uname -r 為 2.6.23.1-42.fc8;

問題: 可以正常編譯我寫的驅動模組,但是載入(insmod)的時候提示錯誤: insmod: error inserting 'xxx.ko': -1 Invalid module format;用# dmesg | tail 看到如下資訊:xxx: version magic '2.6.23.1 SMP mod_unload 686 4KSTACKS ' should be '2.6.23.1-42.fc8 SMP mod_unload 686 4KSTACKS '; 這一行的意思就是說,當前插入的模組xxx.ko的版本資訊(version magic)與正啟動並執行kernel的版本資訊不一致!應該是2.6.23.1-42.fc8 SMP mod_unload 686 4KSTACKS,而實際上xxx.ko的版本資訊卻是:2.6.23.1 SMP mod_unload 686 4KSTACKS; 顯然它們之間差別是很小的。實際上,根據上面安裝的kernel源碼來看,它們應該是沒有什麼差別的。 所以,下面採用了一種比較極端的方式,強制xxx.ko的版本資訊與啟動並執行kernel保持一致。

解決:
     修改/usr/src/kernels/2.6.23.1-42.fc8-i686/include/linux/utsrelease.h檔案中的宏定義
     #define UTS_RELEASE "2.6.23.1"
     為
     #define UTS_RELEASE "2.6.23.1-42.fc8"
     然後重新編譯xxx.ko模組,這時候,它與核心的版本資訊應該就是一致的了!實驗下來確實如此,xxx.ko已經可以正常工作了!
   
     為什麼是修改上面的宏定義呢?來看看/usr/src/kernels/2.6.23.1-42.fc8-i686/include/linux/vermagic.h檔案的內容吧!
     

#include <linux/utsrelease.h>
#include <linux/module.h>

/* Simply sanity version stamp for modules. */
#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#else
#define MODULE_VERMAGIC_PREEMPT ""
#endif
#ifdef CONFIG_MODULE_UNLOAD
#define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "
#else
#define MODULE_VERMAGIC_MODULE_UNLOAD ""
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC ""
#endif

#define VERMAGIC_STRING                                                 
        UTS_RELEASE " "                                                 
        MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT                     
        MODULE_VERMAGIC_MODULE_UNLOAD MODULE_ARCH_VERMAGIC

     其中,VERMAGIC_STRING就是核心的版本資訊,每個kernel module的版本資訊就是從原始碼樹中的該宏定義擷取的。所以,編譯模組的時候一定要和實際使用該模組的核心的原始碼樹保持一致!不要張冠李戴,否則就會在載入模組的時候出現上述問題!

NOTES: 本方法並不是正規的解決辦法,我是由於不想重新編譯安裝linux kernel,並且能夠確保當前源碼樹中的kernel版本與系統啟動並執行kernel版本是相同的情況下採用的權宜之計。如果不能保證這一點,最好不要採用這種方法。以免產生一些莫名其妙的問題!!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.