我正在尝试将 kexec 构建为模块,但遇到了一个奇怪的问题。我的 obj-m 是:
obj-m += kexec.o machine_kexec.o relocate_kernel.o
当我运行 makefile 时,它抱怨“没有规则来制作 relocate_kernel.o 所需的目标 relocate_kernel.c”
我应该如何告诉它包含程序集文件?我查看了内核 Makefile,虽然我不太擅长它们,但似乎确实存在 .S > .o 的规则。我这件事有错吗?
答案1
一如既往,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) 模块
干净: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
所以,我的 Makefile 应该是这样的:
obj-m += kexecmod.o kexecmod-objs := kexec.o machine_kexec.o relocate_kernel.o
哪个将relocate_kernel.S编译成relocate_kernel.o
(对于任何试图将 kexec 编译为模块的人来说,我仍然没有找到所有依赖项,但这是一个开始。)