uSE Linux 10.1下ldd3 hello world例子Invalid module format问题

Sniper167 2006-11-05 10:17:14
我的系统是SuSE Linux 10.1,kernel version是2.6.16.13
我的hello.c和Makefile都是按照ldd3上来写的。
hello.c的代码如下:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

Makefile如下:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KERNELDIR ?=/lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
# $(MAKE) -C /usr/src/linux-2.6.16.13 M=$(PWD) modules
clean:
rm -rf *.o .*.cmd *.ko *.mod.c .tmp_versions *~
endif

我的源码数的路径为/usr/src/linux-2.6.16.13-4-obj/i386/default/
下面是我的一些信息,请帮忙看看,几天了一直没有找到解决方法

#make
make -C /lib/modules/2.6.16.13-4-default/build M=/software modules
make[1]: Entering directory `/usr/src/linux-2.6.16.13-4-obj/i386/default'
CC [M] /software/hello.o
Building modules, stage 2.
MODPOST
CC /software/hello.mod.o
LD [M] /software/hello.ko
make[1]: Leaving directory `/usr/src/linux-2.6.16.13-4-obj/i386/default'

#insmod hello.ko
insmod: error inserting 'hello.ko': -1 Invalid module format //老是这个问题
#insmod -f hello.ko
insmod: error inserting 'hello.ko': -1 Invalid module format

#cat var/log/message
Nov 5 20:42:45 Love-Linux kernel: hello: disagrees about version of symbol struct_module

#uname -r
2.6.16.13-4-default

#cat /lib/modules/2.6.16.13-4-default/build/include/linux/version.h
#define UTS_RELEASE "2.6.16-default"
#define LINUX_VERSION_CODE 132624
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

#cat /usr/include/linux/version.h
#define UTS_RELEASE "2.6.16" //这里跟另外两个地方不一样
#define LINUX_VERSION_CODE 132624
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

#cat /usr/src/linux-2.6.16.13-4-obj/i386/default/include/linux/version.h
#define UTS_RELEASE "2.6.16-default"
#define LINUX_VERSION_CODE 132624
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

-----------------------------------------------------------------
我把/usr/include/linux/version.h下的
#define UTS_RELEASE "2.6.16" 改为 #define UTS_RELEASE "2.6.16-default"了,重启后insmod都还不行
这个问题都困扰我几天了,我无法解决,还请大家能指点一二
...全文
488 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sniper167 2006-11-10
  • 打赏
  • 举报
回复
我把
/lib/modules/2.6.16.13-4-default/build
/usr/src/linux-2.6.16.13-4-obj/i386/default
这两个目录里面的version.h改成和uname -r相同的串。
#define UTS_RELEASE "2.6.16.13-4-default"

Makefile也改成

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 16
EXTRAVERSION = .13-4-default
NAME=Sliding Snow Leopard


出现个很奇怪的问题,inmod hello.ko偶尔能成功,但多数时候照样出现insmod: error inserting 'hello.ko': -1 Invalid module format

具我观察,好像是/usr/src/linux-2.6.16.13-4-obj/i386/default里面的内核正在编译时,insmod hello.ko会成功

现在我重新编译了那两个目录下的内核,两个目录下的version.h都自动变成
#define UTS_RELEASE "2.6.16.13-4-default-default" //就这里变了
#define LINUX_VERSION_CODE 132624
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))


完全糊涂了。。。

Sniper167 2006-11-10
  • 打赏
  • 举报
回复
怎么没人再来指点一下呢
Sniper167 2006-11-06
  • 打赏
  • 举报
回复
哈哈,楼上的,那我又在这请教你咯
/usr/src/linux-2.6.16.13-4-obj/i386/default/Makefile的前四行:

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 16
EXTRAVERSION =
NAME=Sliding Snow Leopard

/lib/modules/2.6.16.13-4-default/build/Makefile的前四行:

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 16
EXTRAVERSION =
NAME=Sliding Snow Leopard

请楼上的帮忙指点下,谢谢
xiangqian 2006-11-06
  • 打赏
  • 举报
回复
faint~ 在linuxforum回过你的问题了。我靠,世界还真tmd小。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧