【问题标题】:Linux kernel: build a out-of-tree module that matches the source tree versionLinux内核:构建与源树版本匹配的树外模块
【发布时间】:2014-12-15 17:08:45
【问题描述】:

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

有人知道如何从树外指定版本吗?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      使用命令行传递内核版本或路径(例如: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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多