我需要构建一个linux内核模块,它必须与我的源树树的版本相匹配。
当我从源代码树内部构建模块时,模块的版本号是我的源代码树之一。但是,当我从源代码树外部构建它时,使用以下makefile,它使用当前正在运行的内核版本。而且我不知道如何使用内核的源代码树。
ifneq ($(KERNELRELEASE),)
obj-m := chardriver.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
我猜问题来自$(shell uname -r)(因为它显然返回正在运行的内核的版本,而不是源代码的版本)
任何人都知道如何从树外指定版本?
答案 0 :(得分:1)
您需要提供要用于构建模块的内核的内核源代码树路径。 make -C
将内核目录路径作为参数。路径/lib/modules/$(shell uname -r)/build
将使用您当前运行的内核。目录/lib/modules/$(shell uname -r)/build
由已构建的内核模块组成,您可以使用它们(链接)构建自己的可加载内核模块。为了使用除了当前运行Makefile的内核之外的内核来交叉编译模块,应该是这样的:
obj-m += chardriver.o
all:
make -C /Path/to/Kernel/Source/Tree/ M=$(PWD)
clean:
rm -fr *.o *.order *.mod.c *.mod.o *.ko Module.symvers
答案 1 :(得分:0)
使用命令行传递内核版本或路径(例如:make KERNELDIR = / path / to / dir /),如果没有传递任何内容使用默认运行内核(或者只是运行make
来获取默认运行的内核),你的makefile应该看起来像这样
ifeq ($(KERNELDIR),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
endif
obj-m += chardriver.o
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules