为什么我的内核模块Makefile在内核4.14下能建立一个.ko,而不是5.6?

问题描述 投票:0回答:1

我有一个Makefile,按照这个例子来做。交叉编译内核模块

我从一个旧的Xilinx源代码中构建了一个4.14的Linux内核,然后用这个脚本构建了一个内核外的模块,将它指向所述的4.14内核源代码,并为我的特定平台架构填充空白。dma-proxy.c)

现在我需要一个较新的版本,并得到了Xilinx的源代码,内核名为5.6.0-rc1.(--branch "zynqmp-soc-for-v5.7" from here)编译那个内核也很好.如果我现在用一个刷新过的干净目录(包括隐藏的文件)和我的模块源代码和那个Makefile,再次指向较新的内核源代码,它既不产生一个.ko文件,也没有错误信息.我得到的是。

make ARCH=arm64 CROSS_COMPILE="aarch64-linux-gnu-" -C /home/sk/src/XILINX/linux-xlnx SUBDIRS=/home/sk/src/XILINX/dma-proxy/driver modules
make[1]: Entering directory '/home/sk/src/XILINX/linux-xlnx'
CALL    scripts/checksyscalls.sh
CALL    scripts/atomic/check-atomics.sh
MODPOST 28 modules
make[1]: Leaving directory '/home/sk/src/XILINX/linux-xlnx'

我觉得很奇怪,它说 "MODPOST 28个模块",而把它指向内核4.14,它预期会说 "1个模块",4.14和5.x之间有什么变化会导致这种情况吗?

makefile linux-kernel kernel-module xilinx
1个回答
0
投票

Mkay,这是我在问题中参考的教程建议的makefile模板。

PWD := $(shell pwd)
obj-m += hello.o

all:
        make ARCH=arm CROSS_COMPILE=$(CROSS) -C $(KERNEL) SUBDIRS=$(PWD) modules
clean:
        make -C $(KERNEL) SUBDIRS=$(PWD) clean

结果发现,如果我... 替换 SUBDIRS=$(PWD)M=$(PWD),它的工作原理。现在,如果我在google上明确地搜索那个M变量,结合构建内核模块,我确实找到了这样显示的文字。但是网络上也有很多使用SUBDIRS的例子,而且我在一个相当新的内核(4.14)上也能用。

然后我确实找到了暗示这是一种老方法的参考文献,例如 从此:

make -C $KDIR SUBDIRS=$PWD
    Same as M=. The SUBDIRS= syntax is kept for backwards compatibility.

事实上,这似乎是真的老了,像。内核 2.6.7 旧版. 不幸的是,相当近的教程显示的是老办法。

© www.soinside.com 2019 - 2024. All rights reserved.