Linux内核:构建一个与源树版本匹配的树外模块

时间:2014-10-20 16:25:09

标签: build module linux-kernel version kernel-module

我需要构建一个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)(因为它显然返回正在运行的内核的版本,而不是源代码的版本)

任何人都知道如何从树外指定版本?

2 个答案:

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