我有几个文件:所谓的库和内核模块,它使用该库中的函数。所有文件都在同一目录中。
lib.c:
#include <linux/module.h>
#include "lib.h"
volatile int check = 0;
int lib_in(void)
{
check = 5;
printk(KERN_ERR "In -> check:%d\n", check);
return 0;
}
void lib_out(void) { printk(KERN_ERR "Out\n"); }
MODULE_LICENSE("GPL");
lib.h:
int lib_in(void);
void lib_out(void);
some_mod.c:
#include <linux/init.h>
#include <linux/module.h>
#include <asm/string.h>
#include "lib.h"
static int __init mod_init(void)
{
printk(KERN_ERR "Loaded\n");
return lib_in();
}
static void ______wtf; mod_exit(void) // syntax error
{
printk(KERN_ERR "Unloaded\n");
lib_out();
}
Plain text - here also should be syntax error
MODULE_LICENSE("GPL");
module_init(mod_init);
module_exit(mod_exit);
虽然以某种方式构建它不会编译some_mod目标文件(甚至不检查其代码),但是会发出some_mod.ko
。顺便说一下,它编译lib.c
。因此可以正确插入模块,但是printk
没有输出。
Makefile:
KDIR = /lib/modules/$(shell uname -r)/build
PWD = $(shell pwd)
TARGET = some_mod
LIB = lib
obj-m := $(TARGET).o
#$(TARGET)-y := $(LIB).o
$(TARGET)-objs := $(LIB).o
all: default
default:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
有人可以告诉我我在做什么错吗?预先感谢。
wtf
行的读取就像是符号定义错误static void ______wtf;
和mod_exit()
缺少类型的混合。尝试将行替换为:
static void __exit mod_exit(void)
用Plain
删除行并重建。
在没有错误,成功的编译和链接以及成功的insmod
之后,printk()的输出应该在控制台,系统messages
文件或这两者上可见。