Skip to content
Snippets Groups Projects
  • Andrii Nakryiko's avatar
    kbuild: Skip module BTF generation for out-of-tree external modules · e732b538
    Andrii Nakryiko authored
    
    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
    
    Fixes: 5f9ae91f ("kbuild: Build kernel module BTFs if BTF is enabled and pahole supports it")
    Reported-by: default avatarBruce Allan <bruce.w.allan@intel.com>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Cc: Jessica Yu <jeyu@kernel.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
    Link: https://lore.kernel.org/bpf/20201121070829.2612884-1-andrii@kernel.org
    e732b538
Makefile.modfinal 2.66 KiB
# SPDX-License-Identifier: GPL-2.0-only
# ===========================================================================
# Module final link
# ===========================================================================

PHONY := __modfinal
__modfinal:

include include/config/auto.conf
include $(srctree)/scripts/Kbuild.include

# for c_flags
include $(srctree)/scripts/Makefile.lib

# find all modules listed in modules.order
modules := $(sort $(shell cat $(MODORDER)))

__modfinal: $(modules)
	@:

# modname and part-of-module are set to make c_flags define proper module flags
modname = $(notdir $(@:.mod.o=))
part-of-module = y

quiet_cmd_cc_o_c = CC [M]  $@
      cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<

%.mod.o: %.mod.c FORCE
	$(call if_changed_dep,cc_o_c)

ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)

quiet_cmd_ld_ko_o = LD [M]  $@
      cmd_ld_ko_o =                                                     \
	$(LD) -r $(KBUILD_LDFLAGS)					\
		$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE)		\
		-T scripts/module.lds -o $@ $(filter %.o, $^);		\
	$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)

quiet_cmd_btf_ko = BTF [M] $@
      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),$?)

# Same as if_changed, but allows to exclude specified extra dependencies
if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check),      \
	$(cmd);                                                              \
	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 $(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))
endif

targets += $(modules) $(modules:.ko=.mod.o)

# Add FORCE to the prequisites of a target to force it to be always rebuilt.
# ---------------------------------------------------------------------------

PHONY += FORCE
FORCE:
# Read all saved command lines and dependencies for the $(targets) we
# may be building above, using $(if_changed{,_dep}). As an
# optimization, we don't need to read them if the target does not
# exist, we will rebuild anyway in that case.

existing-targets := $(wildcard $(sort $(targets)))

-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)

.PHONY: $(PHONY)