History

kbuild: Skip module BTF generation for out-of-tree external modules

In some modes of operation, Kbuild allows to build modules without having vmlinux image around. In such case, generation of module BTF is impossible. This patch changes the behavior to emit a warning about impossibility of generating kernel module BTF, instead of breaking the build. This is especially important for out-of-tree external module builds. In vmlinux-less mode: $ make clean $ make modules_prepare $ touch drivers/acpi/button.c $ make M=drivers/acpi ... 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 ... $ 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

Andrii Nakryiko committed 5 years ago

Commit e732b531 parent 1c26ac61 file · +7 −2Browse files

Unified · Split

scripts/Makefile.modfinal+7−2
@@ -38,7 +38,12 @@ quiet_cmd_ld_ko_o = LD [M] $@ · 37 unmodified lines
38 $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)38 $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
39 39
40quiet_cmd_btf_ko = BTF [M] $@40quiet_cmd_btf_ko = BTF [M] $@
41 cmd_btf_ko = LLVM_OBJCOPY=$(OBJCOPY) $(PAHOLE) -J --btf_base vmlinux $@41 cmd_btf_ko = \
42 if [ -f vmlinux ]; then \
43 LLVM_OBJCOPY=$(OBJCOPY) $(PAHOLE) -J --btf_base vmlinux $@; \
44 else \
45 printf "Skipping BTF generation for %s due to unavailability of vmlinux\n" $@ 1>&2; \
46 fi;
42 47
43# Same as newer-prereqs, but allows to exclude specified extra dependencies48# Same as newer-prereqs, but allows to exclude specified extra dependencies
44newer_prereqs_except = $(filter-out $(PHONY) $(1),$?)49newer_prereqs_except = $(filter-out $(PHONY) $(1),$?)
@@ -49,7 +54,7 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check), \ · 4 unmodified lines
49 printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)54 printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
50 55
51# Re-generate module BTFs if either module's .ko or vmlinux changed56# Re-generate module BTFs if either module's .ko or vmlinux changed
52$(modules): %.ko: %.o %.mod.o scripts/module.lds vmlinux FORCE57$(modules): %.ko: %.o %.mod.o scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE
53 +$(call if_changed_except,ld_ko_o,vmlinux)58 +$(call if_changed_except,ld_ko_o,vmlinux)
54ifdef CONFIG_DEBUG_INFO_BTF_MODULES59ifdef CONFIG_DEBUG_INFO_BTF_MODULES
55 +$(if $(newer-prereqs),$(call cmd,btf_ko))60 +$(if $(newer-prereqs),$(call cmd,btf_ko))