无法使用目标文件正确构建Linux内核模块

问题描述 投票:0回答:1

我有几个文件:所谓的库和内核模块,它使用该库中的函数。所有文件都在同一目录中。

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

有人可以告诉我我在做什么错吗?预先感谢。

c linux makefile linux-kernel gnu-make
1个回答
0
投票

wtf行的读取就像是符号定义错误static void ______wtf;mod_exit()缺少类型的混合。尝试将行替换为:

static void __exit mod_exit(void)

Plain删除行并重建。

在没有错误,成功的编译和链接以及成功的insmod之后,printk()的输出应该在控制台,系统messages文件或这两者上可见。

© www.soinside.com 2019 - 2024. All rights reserved.