无法编译内核模块:没有 .ko 文件输出

Unable to compile kernel module: no .ko file output

我构建了一个 android 内核(source code), now I'm trying to cross-compile a kernel module for it, v4l2loopback to be precise. I've used this 构建内核的工具链(内核版本为 4.9)。

Here on github 可以看到确实有人编译模块成功了,我一直在尝试自己复制他们的成功。但是在实际构建内核模块的最后阶段,我没有得到 .ko 文件输出。这是我得到的:

# setting up
$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-android-
$ export PATH=/home/username/redmi_7a/aarch64-linux-android-4.9-kernel/bin:$PATH
# go to the source code directory
$ cd v4l2loopback
$ export M="$PWD" 
# I have the compiled kernel at /home/username/redmi_7a/kernel
make -C ../kernel
make: entering catalogue «/home/username/redmi_7a/kernel»
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  CHK     include/generated/bounds.h
  CHK     include/generated/timeconst.h
  CHK     include/generated/asm-offsets.h
  CALL    scripts/checksyscalls.sh
  CHK     scripts/mod/devicetable-offsets.h
  Building modules, stage 2.
  MODPOST 4 modules
make: exiting catalogue «/home/username/redmi_7a/kernel»

似乎没有错误,什么也没有,但我得到的只是一个 v4l2loopback.o 文件,而不是 v4l2loopback.ko 文件,如 v4l2loopback github page.

所述

我尝试了 find . -name "*.ko",但没有 return 任何东西。

我可能在内核编译过程中搞砸了,所以这可能不是模块的错。我真的不知道去哪里看,我真的很陌生。

也许我需要在内核 .config 文件中设置一些标志并重新编译?

我真正问的是一个方向,我可能做错了什么?

您的构建似乎不正确。使用 make -C ../kernel,您将完全忽略您尝试构建的模块存储库中的 Makefile,并单独使用内核 Makefile。您应该查看 v4l2loopback 中的 Makefile 并注意文件开头的以下行:

include Kbuild
ifeq ($(KBUILD_MODULES),)

KERNELRELEASE   ?= `uname -r`
KERNEL_DIR      ?= /lib/modules/$(KERNELRELEASE)/build
PWD             := $(shell pwd)
...

因此 PWD 和内核目录已经为您设置好了。您应该只覆盖 KERNEL_DIR 和所需的 cross-compilation 变量:

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
export PATH=/home/username/redmi_7a/aarch64-linux-android-4.9-kernel/bin:$PATH
export KERNEL_DIR=/home/username/redmi_7a/kernel

cd v4l2loopback
make

以上在我的机器上运行并正确生成 v4l2loopback.ko。当然,在执行此操作之前,请确保您已经构建了内核。