2014-10-20 45 views
1

我需要构建一个Linux内核模块,它必须与我的源代码树的版本相匹配。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 

我想这个问题来自于$(外壳使用uname -r)(因为它显然返回正在运行的内核的版本,而不是版本的源码)

任何人知道如何指定来自树外的版本?

回答

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 
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