代码之家  ›  专栏  ›  技术社区  ›  Basilevs

模块布局版本不兼容

  •  27
  • Basilevs  · 技术社区  · 15 年前

    我尝试安装一个由我移植的Linux内核遗留模块。 出现以下错误:

    > sudo insmod camac-mx.ko
    insmod: error inserting 'camac-mx.ko': -1 Invalid module format
    dmesg |tail -n 1
    [1312783.938299] camac_mx: disagrees about version of symbol module_layout
    

    我该怎么解决这个问题?

    6 回复  |  直到 9 年前
        1
  •  29
  •   ctuffli    15 年前

    这表示您已根据与正在运行的内核版本不同的版本编译了该模块。请注意,即使正在运行的内核和内核源代码具有相同的数值(例如,两者都是2.6.31-20-server),如果这两个源代码使用不同的配置选项,您可能会看到此错误。还要检查机器上是否有此模块的多个版本,并确保加载的是正确的版本。

        2
  •  13
  •   Chris Stratton    10 年前

    对于那些在没有访问内核、内核配置或ksyms的系统上工作的用户,如果 working.ko 还有你的身材,不工作, broken.ko .

    很有可能它不会加载,但如果你不顾一切地尝试;

    # modprobe --dump-modversions working.ko
    0x0b11e775      module_layout
    # modprobe --dump-modversions broken.ko
    0x2719d41e      module_layout
    

    然后使用您最喜欢的十六进制编辑器,将其更改为匹配:

    00016c70  75 e7 11 0b 6d 6f 64 75  6c 65 5f 6c 61 79 6f 75  |u...module_layou|
    

    (由于尾数排序,值是反向的) 很可能会有一大堆你必须匹配的。有人可以编写一个Perl脚本来完成这项工作….

        3
  •  7
  •   Tanguy    14 年前

    要解决这个问题(很困难)。

    首先,您需要内核源文件和头文件。

    转到内核基本目录,这里 /usr/src/linux-source-2.6.35版本

    检查 内核版本 这里 2.6.35-27-通用

    make -C /lib/modules/2.6.35-27-generic/build \
    SUBDIRS=/usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k modules
    

    /lib/modules/2.6.35-27-generic/build->/usr/src/linux-headers-2.6.35-27-generic

    检查模块依赖项 显示内核信息 液体燃料电池 并将它们加载到脚本中:

    modprobe -r ath5k
    modprobe cfg80211
    modprobe led_class
    modprobe mac80211
    modprobe ath
    insmod /usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k/ath5k.ko
    

    有了这个方法,Vermagic也会有所不同……make modules_安装是无用的,但可能是因为模块存在于两个不同的位置(lib/modules/extra和…/kernel/drivers),没有被替换…

    modinfo-f vermagic/usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5K/ath5K.ko

    我真的不明白为什么在Ubuntu10.10中修复/调试模块如此困难:(

        4
  •  1
  •   Barak    13 年前

    找到了快速有效的解决方案 here .

    只是使用 modules/build 您的目录 makefile 不是 /usr/src/linux-source .

        make -C /lib/modules/`uname -r`/build ...
    
        5
  •  0
  •   mkc4s    12 年前

    我有安卓系统和一个二进制模块(pvrsrvkm图形)。我一直在从源头为这个系统构建内核。一般来说,一切都可以正常工作,但是对于一些kernel.config选项(对于kgdb),pvrsrvkm模块不会加载为“不同意符号版本”错误。

    pvrsrvkm模块是由Android早期加载的,当它发生故障时,系统无法在没有GUI的情况下使用。

    因为我已经在构建内核,所以我的快速修复方法是通过在内核源文件kernel/module.c中添加一行(verindex=0;)来禁用版本检查:

    static int check_version(Elf_Shdr *sechdrs,
    unsigned int versindex,
    const char *symname,
    struct module *mod,
    const unsigned long *crc,
    const struct module *crc_owner) 
    {
    unsigned int i, num_versions;
    struct modversion_info *versions;
    
    /* Exporting module didn't supply crcs?  OK, we're already tainted. */
    if (!crc)
        return 1;
    
    /* No versions at all?  modprobe --force does this. */
    versindex = 0; // I added this line
    if (versindex == 0)
        return try_to_force_load(mod, symname) == 0;
    
        6
  •  0
  •   Naw    9 年前

    在源内核中之前

    make clean arch=arm cross_compile=arm linux gnueabia-

    在源代码kernel:module.symvers中编辑该文件,将“module_layout”更改为“worked one”,您可以在设备上搜索该文件。

    重新编译驱动程序示例: make-c~/source kernel arch=arm cross_compile=arm linux gnueabihf-dir=/source kernel m=/modules/example modules

    检查您的模块布局xxx.ko 使用:sudo modprobe--dump modversions xxx.ko