linux中的makefile,无法插入模块

时间:2016-02-24 17:14:34

标签: c module makefile linux-kernel

我是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时,据说无法插入模块。 你能告诉我哪里错了吗?

1 个答案:

答案 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_initmodule_exit将注册模块进入和退出功能。