Makefile中的objs会破坏内核模块

时间:2013-11-12 16:09:00

标签: c linux makefile linux-kernel

我正在尝试为显示器编写内核模块,但我正在努力学习基础知识。 如果我尝试分离源文件并通过-objs在Makefile中定义它,内核模块会被编译,加载,但不会做任何事情。

代码:

driver.c

#define LINUX
#include <linux/module.h> 
#include <linux/kernel.h>
#include "display.h"

int init_module(void) {
    printk(KERN_INFO "module registered\n");
    init_display();
    return 0;
}

void cleanup_module(void) {
     printk(KERN_INFO "module unregistered\n");
}

display.h

#ifndef DISPLAY_H
#define DISPLAY_H
void init_display (void);
#endif

display.c

#include "display.h"
#include <linux/module.h>  /* Needed by all modules */
#include <linux/kernel.h>  /* Needed for KERN_ALERT */

void init_display (void) {
    printk(KERN_INFO "initialize display\n");
}

生成文件

obj-m := driver.o
driver-objs := driver.o display.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean

如果没有Makefile中的include和driver-objs,我将获得KERN_INFO(加载,卸载)输出,并且kernellog为空。

任何方向,我做错了什么?

1 个答案:

答案 0 :(得分:2)

我怀疑第一条规则(obj-m:= driver.o)尝试直接使用driver.c。加载模块时,无法找到init_display,模块加载失败。

尝试重命名驱动程序名称,以使Makefile看起来像:

obj-m := mydriver.o
mydriver-y := driver.o display.o