构建内核模块时 obj-m 列表中的程序集文件

try*_*tch 2 kernel make kernel-modules assembly

我正在尝试将 kexec 构建为一个模块,但遇到了一个奇怪的问题。我的 obj-m 是:

obj-m += kexec.o machine_kexec.o relocate_kernel.o

当我运行 makefile 时,它​​抱怨说“没有规则可以制作 relocate_kernel.o 需要的目标 relocate_kernel.c”

我应该如何告诉它包含程序集文件?我查看了内核 Makefile,虽然我对它们不是很好,但似乎确实存在 .S > .o 的规则。我错了吗?

try*_*tch 6

一如既往,RTFM。回答这个问题并留下来帮助可能遇到这个问题的其他人。根据 Linux 文档项目,我错误地使用了 obj-m:

有时在多个源文件之间划分内核模块是有意义的。这是此类内核模块的示例。

[源文件...]

最后,makefile:

例 2-10。生成文件

obj-m += hello-1.o obj-m += hello-2.o obj-m += hello-3.o obj-m += hello-4.o obj-m += hello-5.o obj-m += startstop.o startstop-objs := start.o stop.o

全部:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) 模块

清洁:使 -C /lib/modules/$(shell uname -r)/build M=$(PWD) 清洁

Linux内核模块编程指南:2.7。跨越多个文件的模块

所以,我的 Makefile 应该是这样写的:

obj-m += kexecmod.o
kexecmod-objs := kexec.o machine_kexec.o relocate_kernel.o

其中将 relocate_kernel.S 编译成 relocate_kernel.o

(对于试图将 kexec 编译为模块的任何人来说,我仍然没有找到所有的依赖项,但这是一个开始。)