zoukankan      html  css  js  c++  java
  • insmod hello.ko -1 Invalid module format最简单的解决的方法

    在下也是从网上搜索到的这样的解决的方法。

    遇到这样的情况后,通过dmesg看一下内核日志。

    假设发现有例如以下日志。那就好办了。

    hello: version magic '2.6.33.3 ' should be '2.6.33.3-85.fc13.i686.PAE SMP mod_unload 686 '

    改动内核源代码文件include/linux/vermagic.h

    把例如以下VERMAGIC_STRING宏的定义删掉

    #define VERMAGIC_STRING  
    UTS_RELEASE " " 
    MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT  
    MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS 
    MODULE_ARCH_VERMAGIC


    然后,从新定义一个VERMAGIC_STRING宏

    #define VERMAGIC_STRING  "should be '2.6.33.3-85.fc13.i686.PAE SMP mod_unload 686 "

    注意,双引號中的内容,要与dmesg输出的日志中should be后面的单引號中的内容,全然同样。别漏掉了那个空格哦。


    好了,如今又一次编译一下你的模块,再载入一次吧。

    基本上应该会OK啦。


    须要指出的是,这样的方法非常不正规。

    假设你仅仅是急于开发验证模块,不想又一次编译安装新内核,能够暂时使用一下。

    并且,用的时候,也要注意一下,模块编译所用的内核版本号与实际执行的内核版本号。

    大体上也要比較接近才行。否则可能会出问题的。

    假设是正式的产品。请务必保证。模块是基于实际执行的内核编译出来的。



    好了。问题攻克了。以下再闲说几句模块的载入。

    实际上。Linux下模块的载入。是通过系统调用sys_init_module完毕的。

    对于2.6的内核。sys_init_module的代码在kernel/module.c中

    sys_init_module调用load_module,load_module则检查模块的vermagic是否与内核的一样。



    modmagic = get_modinfo(sechdrs, infoindex, "vermagic");
    /* This is allowed: modprobe --force will invalidate it. */
    if (!modmagic) {
    tainted |= TAINT_FORCED_MODULE;
    printk(KERN_WARNING "%s: no version magic, tainting kernel. ",
          mod->name);
    } else if (!same_magic(modmagic,vermagic)) {
    printk(KERN_ERR "%s: version magic '%s' should be '%s' ",
          mod->name, modmagic, vermagic);
    err = -ENOEXEC;
    goto free_hdr;
    }


    vermagic是内核中保存的magic。其定义例如以下。可见他的值也就来自于我们上面定义的宏。

    static const char vermagic[] = VERMAGIC_STRING;


    除了检查vermagic。load_module还会检查模块的许可证的兼容性,

    详细调用链是:load_module->set_license->license_is_gpl_compatible

    从以下license_is_gpl_compatible的代码,能够看出内核支持的许可证类型。



    static inline int license_is_gpl_compatible(const char *license)
    {
            return (strcmp(license, "GPL") == 0
                    || strcmp(license, "GPL v2") == 0
                    || strcmp(license, "GPL and additional rights") == 0
                    || strcmp(license, "Dual BSD/GPL") == 0
                    || strcmp(license, "Dual MIT/GPL") == 0
                    || strcmp(license, "Dual MPL/GPL") == 0);
    }


    因此,我们的模块代码中MODULE_LICENSE("Dual MIT/GPL")这一项,也要注意符合license_is_gpl_compatible中的要求才行。否则的话。载入模块时。可能又要看到例如以下的告警了 :)

    hello: module license  'xxx'  taints kernel.




  • 相关阅读:
    最长回文字符(需要补)
    无重复字符的最长子串
    两数之和——链表
    两个数之和
    android 动画基础绘——帧动画(三)
    android 动画基础绘——view 动画(二)[补]
    android 动画基础绘——view 动画
    全国疫情精准定点动态更新(.net core)
    桶排序
    计数排序
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6907027.html
Copyright © 2011-2022 走看看