On Mon, Nov 16, 2020 at 1:24 PM Jakub Kicinski <kuba@xxxxxxxxxx> wrote: > > On Mon, 16 Nov 2020 12:34:17 -0800 Andrii Nakryiko wrote: > > > This change, commit 5f9ae91f7c0d ("kbuild: Build kernel module BTFs if BTF is enabled and pahole > > > supports it") currently in net-next, linux-next, etc. breaks the use-case of compiling only a specific > > > kernel module (both in-tree and out-of-tree, e.g. 'make M=drivers/net/ethernet/intel/ice') after > > > first doing a 'make modules_prepare'. Previously, that use-case would result in a warning noting > > > "Symbol info of vmlinux is missing. Unresolved symbol check will be entirely skipped" but now it > > > errors out after noting "No rule to make target 'vmlinux', needed by '<...>.ko'. Stop." > > > > > > Is that intentional? > > > > I wasn't aware of such a use pattern, so definitely not intentional. > > But vmlinux is absolutely necessary to generate the module BTF. So I'm > > wondering what's the proper fix here? Leave it as is (that error > > message is actually surprisingly descriptive, btw)? Force vmlinux > > build? Or skip BTF generation for that module? > > For an external out-of-tree module there is no guarantee that vmlinux > will even be on the system, no? So only the last option can work in > that case. Ok, how about something like the patch below. With that I seem to be getting the desired behavior: $ make clean $ touch drivers/acpi/button.c $ make M=drivers/acpi make[1]: Entering directory `/data/users/andriin/linux-build/default-x86_64' CC [M] drivers/acpi/button.o MODPOST drivers/acpi/Module.symvers LD [M] drivers/acpi/button.ko BTF [M] drivers/acpi/button.ko Skipping BTF generation for drivers/acpi/button.ko due to unavailability of vmlinux make[1]: Leaving directory `/data/users/andriin/linux-build/default-x86_64' $ readelf -S ~/linux-build/default/drivers/acpi/button.ko | grep BTF -A1 ... empty ... Now with normal build: $ make all ... LD [M] drivers/acpi/button.ko BTF [M] drivers/acpi/button.ko ... $ readelf -S ~/linux-build/default/drivers/acpi/button.ko | grep BTF -A1 [60] .BTF PROGBITS 0000000000000000 00029310 000000000000ab3f 0000000000000000 0 0 1 diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal index 02b892421f7a..d49ec001825d 100644 --- a/scripts/Makefile.modfinal +++ b/scripts/Makefile.modfinal @@ -38,7 +38,12 @@ quiet_cmd_ld_ko_o = LD [M] $@ $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) quiet_cmd_btf_ko = BTF [M] $@ - cmd_btf_ko = LLVM_OBJCOPY=$(OBJCOPY) $(PAHOLE) -J --btf_base vmlinux $@ + cmd_btf_ko = \ + if [ -f vmlinux ]; then \ + LLVM_OBJCOPY=$(OBJCOPY) $(PAHOLE) -J --btf_base vmlinux $@; \ + else \ + printf "Skipping BTF generation for %s due to unavailability of vmlinux\n" $@ 1>&2; \ + fi; # Same as newer-prereqs, but allows to exclude specified extra dependencies newer_prereqs_except = $(filter-out $(PHONY) $(1),$?) @@ -49,7 +54,7 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check), \ printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) # Re-generate module BTFs if either module's .ko or vmlinux changed -$(modules): %.ko: %.o %.mod.o scripts/module.lds vmlinux FORCE +$(modules): %.ko: %.o %.mod.o scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE +$(call if_changed_except,ld_ko_o,vmlinux) ifdef CONFIG_DEBUG_INFO_BTF_MODULES +$(if $(newer-prereqs),$(call cmd,btf_ko))