您的位置:首页 > 其它

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

2015-01-23 17:45 609 查看
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"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐