insmod: error inserting 'hello.ko': -1 Invalid module format

相当棒的文章 
转自:http://apps.hi.baidu.com/share/detail/14755964 
我自己的解决方法: 
1,根据modinfo hello.ko命令查看vermagic的值 
2,根据uname -r查看内核版本 
3,对比上边两步的值是否相同 
若相同,我就不知道了 
若不同,采用make -C /lib/modules/此处为你内核版本号对应的文件夾/build M=你模块源码的路徑 modules 



1, make xconfig 
General setup---->>>local version -append to kernel release:       在这儿添加下面内容 
-170.2.117.fc10.i686 

or modify ./.config file: 

# General setup 

CONFIG_EXPERIMENTAL=y 
CONFIG_LOCK_KERNEL=y 
CONFIG_INIT_ENV_ARG_LIMIT=32 
CONFIG_LOCALVERSION="-170.2.117.fc10.i686" 

.config配置文件 
在内核树的根目录中,有一个.config文件,它记录了内核的配置选项,可直接对它进行修改,再运行(若.config不存在,对内核进行配置后会生成它,这种情况下当然不能开始就运行oldconfig). 实际上, 如果你手头有合适的 .config 文件, 可以运行 make oldconfig  直接按 .config 的内容来配置 


2, save config 

3, make kernel 
then the ./include/linux/utsrelease.h  will change from linux-2.6.27.41 to linux-2.6.27.41-170.2.117.fc10.i686 



[leo@leo linux-2.6.27.41-170.2.117.fc10.i686]$ findcode 2.6.27.41 
./include/linux/autoconf.h: * Linux kernel version: 2.6.27.41 
./include/linux/utsrelease.h:#define UTS_RELEASE "2.6.27.41" 
[leo@leo linux-2.6.27.41-170.2.117.fc10.i686]$ vi ./include/linux/utsrelease.h 


[leo@leo test]$ sudo cat /var/log/messages | tail 
Jul  2 17:07:32 leo dhcpd: DHCPACK on 192.168.1.93 to 00:02:9b:48:7a:04 via eth1 
Jul  2 17:09:46 leo kernel: hello: version magic '2.6.27.41 SMP mod_unload 686 4KSTACKS ' should be '2.6.27.41-170.2.117.fc10.i686 SMP mod_unload 686 4KSTACKS ' 





  在使用命令ismod helloworld.ko 加载编译成功的模块helloworld.ko时出现错误  insmod: error inserting 'helloworld.ko': -1 Invalid module format 

一般出错信息被记录在文件/var/log/messages中 
[root@hailiang linux-2.6.15.5]# cat /var/log/messages |tail 

  May  8 16:41:45 hailiang kernel: helloworld: version magic '2.6.27.5-117.fc10.i686 SMP mod_unload modversions 686 4KSTACKS ' should be '2.6.27.5-117.fc10.i686 SMP mod_unload 686 4KSTACKS ' 

通过命令看一下模块的相关信息 

[root@hailiang tmp]# modinfo helloworld.ko 
filename:       helloworld.ko 
alias:          a simplest module 
description:    A simple helloworld module 
author:         zhanghailiang 
depends:       
vermagic:       2.6.27.5-117.fc10.i686 SMP mod_unload modversions 686 4KSTACKS  

内核无法加载模块的原因是因为记载版本号的字符串和当前正在运行的内核模块的不一样,这个版本印戳作为一个静态的字符串存在于内核模块中,叫vermagic,可以从编译模块中间生成的文件helloworld.moc.h中 

#include <linux/module.h> 
#include <linux/vermagic.h> 
#include <linux/compiler.h> 

MODULE_INFO(vermagic, VERMAGIC_STRING);找到这个符号, 

打开文件/usr/src/kernels /2.6.27.5-117.fc10.i686/include/linux/vermagic.h (注意在fedroa 10 中源码树是在/usr/src/下) 

#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_MODVERSIONS 
#define MODULE_VERMAGIC_MO 

DVERSIONS "modversions " 
#else 
#define MODULE_VERMAGIC_MODVERSIONS "" 
#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_VERMAGIC_MODVERSIONS       / 
MODULE_ARCH_VERMAGIC 

从这里看出vermagic中多出来的字符modversions是由于编译内核时选上了 “”选项的原因,(其实这是因为在编译helloworld模块前,自己曾试图重新编译内核所致:cd /usr/src/kernel.. 

[root@hailiang 2.6.27.5-117.fc10.i686]# make menuconfig 
scripts/kconfig/mconf arch/x86/Kconfig 

# configuration written to .config 



*** End of Linux kernel configuration. 
*** Execute 'make' to build the kernel or try 'make help'. 

[root@hailiang 2.6.27.5-117.fc10.i686]# make 
scripts/kconfig/conf -s arch/x86/Kconfig 
CHK     include/linux/version.h 
CHK     include/linux/utsrelease.h 
make[1]: *** No rule to make target `missing-syscalls'.  Stop. 
make: *** [prepare0] Error 2 

)见下图 


然后再重新编译helloworld.ko模块,然后再加载helloworld 成功。 

  一点别的:在网上对这个问题有另一个解决方法就是modprobe --force-vermagic helloworld强制加载内核,在这里我试了一下问题还是原来invalid module format 

注意:(1)modprobe   模块名(不要带后缀.ko)   注:挂载一个模块 

(2)在这里直接modprobe ./helloworld 错误 
FATAL: Module helloworld not found. 
这是因为 

使用man modprobe看 

DESCRIPTION 

      modprobe intelligently adds or removes a module from the Linux kernel: note that  for  conve- 
nience, there is no difference between _ and - in module names.  modprobe looks in the module 
directory /lib/modules/‘uname -r‘ for all  the  modules  and  other  files,  except  for  the 
optional  /etc/modprobe.conf  configuration  file  and  /etc/modprobe.d  directory  (see mod- 
probe.conf(5)). modprobe will also use module options specified on the kernel command line i 
modprobe会自动在/lib/modules/'uname -r'下寻找模块加载,将helloworld.ko拷到/lib/modules 下然后再执命令 modprobe helloworld 发现还是找不到,从man modprobe 

  modprobe  expects  an  up-to-date  modules.dep  file, as generated by depmod (see depmod(8)) 

看出还需要依赖命令:depmod生成的module.dep 使用这个命令后 在modprobe helloworld 成功 

findcode sell program. 
#!/bin/sh                       

if [ "$1" = "" ]; then 
echo "Syntax:"    
echo " fcode [-q] [-i] [-b] [-t] [-nc] [-p path] code" 
echo " -q: only print file names"                     
echo " -i: case insensitive"                          
echo " -b: look also in build dirs: '*-linux-gnu/...'" 
echo " -t: don't look in '3pp/...'" 
echo " -nc: no color grep (is useful when piping output)." 

exit 
fi 

path=. 

grep_cmd="/bin/grep --color=always" 

while (( "$#" )); do 
if [ "$1" == "-q" ] ; then 
quiet="-l" 
fi 
if [ "$1" == "-i" ] ; then 
ignore_case="-i" 
fi 
if [ "$1" == "-b" ] ; then 
### This will destroy the pruning of *-linux-gnu and 
### therefore those directories will be checked: 
check_build_dirs="true" 
fi 
if [ "$1" == "-t" ] ; then 
skip_3pp="-name 3pp -prune -or" 
fi 
if [ "$1" == "-p" ] ; then 
shift; 
path="$1" 
fi 
if [ "$1" == "-nc" ]; then 
grep_cmd="/bin/grep" 
fi 

code=$1 
shift; 
done 

find $path -name "dist" -prune -or -name ".svn" -prune -or / 
-name "*-linux-gnu$check_build_dirs" -prune -or $skip_3pp / 
-iname "*.c" -or -iname "*.h" -or -iname "*.cpp" -or / 
-name "Makefile*" -or -name "Imakefile" -or -name "dist_*" -or / 
-name "dist-*" -or -name "*.idl" -or -name "*.htm*" -or / 
-name "*.xml" -or -name "*.sh" -or -name "*.perl" -or / 
-name "*.pl" -or -name "configure" -or -name "*.in" -or / 
-name "*.patch" -or -name "PATCHES" | sed -e "s/ /g" | / 
xargs $grep_cmd $quiet $ignore_case "$code" 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值