我有一个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之间有什么变化会导致这种情况吗?
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 旧版. 不幸的是,相当近的教程显示的是老办法。