Friday, February 25, 2022

[SOLVED] Unable to compile kernel module: no .ko file output

Issue

I've built an android kernel (source code), now I'm trying to cross-compile a kernel module for it, v4l2loopback to be precise. I've used this toolchain to build the kernel (kernel version is 4.9).

Here on github you can see that someone actually succeeded in compiling the module, and I've been trying to replicate their success myself. But in the last stage of actually building the kernel module I don't get a .ko file output. Here is what I get:

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

Seems like no errors, no nothing, but all I get is a v4l2loopback.o file, instead of v4l2loopback.ko file, as mentioned per v4l2loopback github page.

I tried find . -name "*.ko", but it didn't return anything.

I might've screwed something up during the kernel compilation, so it might not module's fault. I don't really know where to look, I'm really new to this.

Maybe I need to set some flag in the kernel .config file and recompile?

All I really ask is a direction, what are the things I might've done wrong?


Solution

You seem to be building incorrectly. With make -C ../kernel you are completely ignoring the Makefile that is in the repository of the module you are trying to build and using the kernel Makefile alone. You should take a look at the Makefile inside v4l2loopback and notice the following lines at the beginning of the file:

include Kbuild
ifeq ($(KBUILD_MODULES),)

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

So the PWD and kernel dir are already set for you. You should just override KERNEL_DIR and the needed cross-compilation variables:

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

The above works on my machine and correctly produces v4l2loopback.ko. Make sure you have built the kernel before doing this of course.



Answered By - Marco Bonelli
Answer Checked By - Cary Denson (WPSolving Admin)