我是linux编程的新手,我在makefile上苦苦创作。我有3个文件: 的hello.c
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include "funcs.h"
int init_module(void) {
asgard();
return 0;
}
void cleanup_module(void) {
printk(KERN_INFO "Goodbye world 1.\n");
}
funcs.c里
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include "funcs.h"
void asgard(void) {
printk(KERN_INFO "Asgard balordo\n");
return;
}
funcs.h
#include <linux/module.h> /* Needed by all modules */
void asgard(void);
然后是makefile:
obj-m += hello.o
hello-objs := funcs.o
first:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
all: funcs.o hello.o
gcc -o start funcs.o hello.o
funcs.o: funcs.c funcs.h
gcc -C funcs.c
hello.o: hello.c funcs.h
gcc -C hello.c
clean:
rm -f *.o
rm -f ./start
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
当我编译时,一切都很好,当我调用insmod ./hello.ko时,据说无法插入模块。 你能告诉我哪里错了吗?
答案 0 :(得分:1)
好吧,你不需要在你的makefile中调用GCC来构建一个模块,试试这个makefile:
obj-m += hello.o
hello-objs := funcs.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
此外,您可以告诉模块哪个功能是入口点和出口点,并且可以声明模块描述,作者和许可。 (Why here)
试试这个:
static int __init enter_module(void)
{
return 0;
}
static void __exit exit_module(void)
{
}
module_init(enter_module);
module_exit(exit_module);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("John <john@jonnyland.com>");
MODULE_DESCRIPTION("This is the module description.");
内核关键字__init
和__exit
用于让内核尽可能通过从内存中删除函数来进行优化。
宏module_init
和module_exit
将注册模块进入和退出功能。