ubuntu7.04下面编译模块问题!请大家帮助!谢谢!

内核编译和嵌入式产品的设计与开发
回复
csuqc19841001
帖子: 10
注册时间: 2007-11-03 11:35

ubuntu7.04下面编译模块问题!请大家帮助!谢谢!

#1

帖子 csuqc19841001 » 2007-12-16 21:15

//在ubuntu上面的原程序如下:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("Dual BSD/GPL");

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

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

module_init(hello_init);
module_exit(hello_exit);

在终端输入编译命令如下:
gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/src/linux-headers-2.6.20-15/include -c -o hello.o hello.c


但是并不能通过编译,错误提示如下::
In file included from /usr/src/linux-headers-2.6.20-15/include/asm/thread_info.h:16,
from /usr/src/linux-headers-2.6.20-15/include/linux/thread_info.h:21,
from /usr/src/linux-headers-2.6.20-15/include/linux/preempt.h:9,
from /usr/src/linux-headers-2.6.20-15/include/linux/spinlock.h:49,
from /usr/src/linux-headers-2.6.20-15/include/linux/module.h:9,
from hello.c:2:
/usr/src/linux-headers-2.6.20-15/include/asm/processor.h:82: 错误: ‘CONFIG_X86_L1_CACHE_SHIFT’ 未声明 (不在函数内)
/usr/src/linux-headers-2.6.20-15/include/asm/processor.h:82: 错误: 要求的对齐边界不是常量
在包含自 /usr/src/linux-headers-2.6.20-15/include/linux/sched.h:51 的文件中,
从 /usr/src/linux-headers-2.6.20-15/include/linux/utsname.h:35,
从 /usr/src/linux-headers-2.6.20-15/include/asm/elf.h:12,
从 /usr/src/linux-headers-2.6.20-15/include/linux/elf.h:7,
从 /usr/src/linux-headers-2.6.20-15/include/linux/module.h:15,
从 hello.c:2:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:33:3: 错误: #error You lose.
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:225:31: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:269:46: 错误: #if 中用零做除数
In file included from /usr/src/linux-headers-2.6.20-15/include/linux/sched.h:51,
from /usr/src/linux-headers-2.6.20-15/include/linux/utsname.h:35,
from /usr/src/linux-headers-2.6.20-15/include/asm/elf.h:12,
from /usr/src/linux-headers-2.6.20-15/include/linux/elf.h:7,
from /usr/src/linux-headers-2.6.20-15/include/linux/module.h:15,
from hello.c:2:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h: 在函数 ‘jiffies_to_msecs’ 中:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:274: 错误: ‘CONFIG_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:274: 错误: (即使在一个函数内多次出现,每个未声明的标识符在其
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:274: 错误: 所在的函数内只报告一次。)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:280:46: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h: 在函数 ‘jiffies_to_usecs’ 中:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:285: 错误: ‘CONFIG_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:293:46: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h: 在函数 ‘msecs_to_jiffies’ 中:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:298: 错误: ‘CONFIG_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:306:46: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h: 在函数 ‘usecs_to_jiffies’ 中:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:311: 错误: ‘CONFIG_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h: 在函数 ‘timespec_to_jiffies’ 中:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:330: 错误: ‘CONFIG_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:336: 错误: ‘SHIFT_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h: 在函数 ‘jiffies_to_timespec’ 中:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:349: 错误: ‘CONFIG_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h: 在函数 ‘timeval_to_jiffies’ 中:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:371: 错误: ‘CONFIG_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:375: 错误: ‘SHIFT_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h: 在函数 ‘jiffies_to_timeval’ 中:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:387: 错误: ‘CONFIG_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:400:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h: 在函数 ‘jiffies_to_clock_t’ 中:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:401: 错误: ‘CONFIG_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h: 在函数 ‘clock_t_to_jiffies’ 中:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:412: 错误: ‘CONFIG_HZ’ 未声明 (在此函数内第一次使用)
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:431:6: 错误: #if 中用零做除数
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h: 在函数 ‘jiffies_64_to_clock_t’ 中:
/usr/src/linux-headers-2.6.20-15/include/linux/jiffies.h:432: 错误: ‘CONFIG_HZ’ 未声明 (在此函数内第一次使用)
在包含自 /usr/src/linux-headers-2.6.20-15/include/linux/module.h:21 的文件中,
从 hello.c:2:
/usr/src/linux-headers-2.6.20-15/include/asm/module.h:62:2: 错误: #error unknown processor family
朱仔
帖子: 1
注册时间: 2008-01-05 16:19

#2

帖子 朱仔 » 2008-01-05 16:23

内核编程的时候也遇到同样的问题了!几乎都一样~!
到处找都没找到答案…… :cry:
不过,在另一个论坛也看到同样的问题,然后那个楼主后来自己解决了,留下了这么句话:
搞定了,难道就没有人知道吗,就是编译连接库文件路径不对
/lib/modules/2.6.18-1.2798.fc6/build
然后就没有下文了,小弟才接触linux没几天……看了还是白看啊。
那位高手再拉我一把啊,谢谢。
ylyang05
帖子: 32
注册时间: 2007-04-17 20:06

#3

帖子 ylyang05 » 2008-01-09 16:26

2.4内核编译的方法和2.6内核是有区别的。具体什么区别我也说不上来,可能是内核的编写的区别
编译内核模块你们使用下面的Makefile试试看
ifneq ($(KERNELRELEASE),)
obj-m :=readtest.o
else
KDIR :=/lib/modules/`uname -r`/build
PWD :=$(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
endif
编译的时候只要有源程序 改了obj-m的那个选项的名字就好了。
我一直是用的这个方法。没有出现过问题。
加载的时候加载生成的.ko文件就好了。
具体的可以参考linux device drivers (第三版)
我肯定会尽我所能帮助那些需要帮助的人,因为别人也帮助过我~
fourbears
帖子: 6
注册时间: 2007-06-18 10:02

#4

帖子 fourbears » 2008-01-17 10:17

按楼上方法可行 书上不是也有么
$MAKE对应你用的gcc版本

我有一个问题就是 如果要编译一个特定版本的模块 KDIR :=/lib/modules/`uname -r`/build 只是针对当前shell版本的么???

该怎么作
crossie
帖子: 241
注册时间: 2008-05-25 20:35

#5

帖子 crossie » 2008-07-21 13:39

我也遇到同样的问题了....我的makefile是

代码: 全选

TARGET  := hello-1
WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
INCLUDE := -isystem /lib/modules/`uname -r`/build/include
CFLAGS  := -c -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
CC      := gcc

${TARGET}.o: ${TARGET}.c

.PHONY: clean

clean:
        rm -rf ${TARGET}.o
程序代码是

代码: 全选

#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
        printk("<1>Hello world 1. \n");
}

void cleanup_module(void)
{
        printk(KERN_ALERT "Goodbye world 1. \n");
}
crossie
帖子: 241
注册时间: 2008-05-25 20:35

Re:

#6

帖子 crossie » 2008-09-22 10:11

makefile应该是

代码: 全选

obj-m += hello-1.o
all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
回复