我需要一些KBuild
与构建外部模块相关的实施细节建议。
Linux Kernel 5.0.0-32
这是我的LKM
Makefile:
obj-m += pfsw.o
pfsw-objs := src/init.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
查看scripts/Makefile.build
带有选项的调试输出的实现和打印,-d
我发现正在执行的这个makefile的目标是__build
:
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
$(subdir-ym) $(always)
@:
由于我正在构建外部 LKM,因此唯一的先决条件是$(obj-m)
和$(modorder-target)
. 我从数据库中得到了它们的值:
obj-m := /home/memyself/lkm/procfs_write_perm/pfsw.o
modorder-target := /home/memyself/lkm/procfs_write_perm/modules.order
所以要执行__build
先决条件/home/memyself/lkm/procfs_write_perm/pfsw.o
必须首先构建。中定义了以下$(obj)/%.o:
模式规则Makefile.build
:
$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
$(call cmd,force_checksrc)
$(call if_changed_rule,cc_o_c)
我添加了调试输出以打印目标自动变量的名称:
$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
@echo "$@"
$(call cmd,force_checksrc)
$(call cmd,force_check_kmsg)
$(call if_changed_rule,cc_o_c)
并期望/home/memyself/lkm/procfs_write_perm/pfsw.o
被打印,但实际上/home/memyself/lkm/procfs_write_perm/src/init.o
被打印了。这看起来像一些魔法......
问题:为什么构建目标/home/memyself/lkm/procfs_write_perm/pfsw.o
会导致构建/home/memyself/lkm/procfs_write_perm/src/init.o
?它在代码中的哪个位置指定?
我知道有一个real-obj-m
包含确切值的变量,但是grep
根据某些东西我没有找到它的代码库...