无法编译内核模块:没有 .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
。当然,在执行此操作之前,请确保您已经构建了内核。
我构建了一个 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
。当然,在执行此操作之前,请确保您已经构建了内核。