Linux动态模块怎样编译?
发布网友
发布时间:2022-04-23 00:50
我来回答
共3个回答
热心网友
时间:2022-05-01 17:53
这个需要编写Makefile文件
首先说一下你的程序有错误:下面这个是我改的,
first.c:
#include<linux/mole.h>
#include<linux/init.h>
static int __init hello_init(void) {
printk(KERN_ALERT "Hello,kernal\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_ALERT "Goodbye,kernal\n");
}
MODULE_LICENSE( "GPL" );
mole_init(hello_init);
mole_exit(hello_exit);
对于你这个程序,我写了一份:
obj-m := first.o #这个是要中间文件
Kernel_path=/usr/src/linux-headers-$(shell uname -r) #内核存在的路径
all:
make -C $(Kernel_path) M=$(PWD) moles
clean:
make -C $(Kernel_path) M=$(PWD) clean
像你的就该为
Kernel_path=/usr/src/linux-headers-$(shell uname -r)/build
保存后make,ok!追问make -C /usr/src/linux-headers-2.6.35-22-generic M=/home/ubuntu/kernal of linux/sy4 moles
make[1]: Entering directory `/usr/src/linux-headers-2.6.35-22-generic'
make[1]: *** No rule to make target `of'. Stop.
make[1]: Leaving directory `/usr/src/linux-headers-2.6.35-22-generic'
make: *** [all] Error 2
错误跟原来一样,我是直接用了你改过的程序和Makefile,在all和clean下一行的Tab也加了。
追答你的kernel是在/lib/moles/2.6.35-22-generic/build下
需要该Kernel_path=/lib/moles/$(shell uname -r)/build
就是Kernel_path要指向你的内核放的地方。
你这样改改再看看。。。
一般Ubuntu的内核都是在/usr/src/linux-headers-$(shell uname -r)下的。
热心网友
时间:2022-05-01 19:11
编译模块的make file 必须是Makefile,不能是makefile. //why?
ifneq ($(KERNELRELEASE),)
obj-m := your.o
mytest-objs := file1.o file2.o file3.o
else
KDIR := /lib/moles/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) moles
endif
把your换成你的source name ,然后保存为Mafefile ,make 一次就可以了。
热心网友
时间:2022-05-01 20:46
我也一直被这个问题困扰着,求解。