mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-07 02:19:54 +00:00
commita26a6c93edupstream. After commitd50f210913("kbuild: align modinfo section for Secureboot Authenticode EDK2 compat"), running modules_install with certain versions of kmod (such as 29.1 in Ubuntu Jammy) in certain configurations may fail with: depmod: ERROR: kmod_builtin_iter_next: unexpected string without modname prefix The additional padding bytes to ensure .modinfo is aligned within vmlinux.unstripped are unexpected by kmod, as this section has always just been null-terminated strings. Strip the trailing padding bytes from modules.builtin.modinfo after it has been extracted from vmlinux.unstripped to restore the format that kmod expects while keeping .modinfo aligned within vmlinux.unstripped to avoid regressing the Authenticode calculation fix for EDK2. Cc: stable@vger.kernel.org Fixes:d50f210913("kbuild: align modinfo section for Secureboot Authenticode EDK2 compat") Reported-by: Omar Sandoval <osandov@fb.com> Reported-by: Samir M <samir@linux.ibm.com> Reported-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com> Closes: https://lore.kernel.org/7fef7507-ad64-4e51-9bb8-c9fb6532e51e@linux.ibm.com/ Tested-by: Omar Sandoval <osandov@fb.com> Tested-by: Samir M <samir@linux.ibm.com> Tested-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com> Reviewed-by: Nicolas Schier <nsc@kernel.org> Link: https://patch.msgid.link/20251105-kbuild-fix-builtin-modinfo-for-kmod-v1-1-b419d8ad4606@kernel.org Signed-off-by: Nathan Chancellor <nathan@kernel.org> [nathan: Apply to scripts/Makefile.vmlinux_o, location of modules.builtin.modinfo rule prior to39cfd5b121] Signed-off-by: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
129 lines
4.2 KiB
Makefile
129 lines
4.2 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
PHONY := __default
|
|
__default: vmlinux.o modules.builtin.modinfo modules.builtin
|
|
|
|
include include/config/auto.conf
|
|
include $(srctree)/scripts/Kbuild.include
|
|
|
|
# for objtool
|
|
include $(srctree)/scripts/Makefile.lib
|
|
|
|
# Generate a linker script to ensure correct ordering of initcalls for Clang LTO
|
|
# ---------------------------------------------------------------------------
|
|
|
|
quiet_cmd_gen_initcalls_lds = GEN $@
|
|
cmd_gen_initcalls_lds = \
|
|
$(PYTHON3) $(srctree)/scripts/jobserver-exec \
|
|
$(PERL) $(real-prereqs) > $@
|
|
|
|
.tmp_initcalls.lds: $(srctree)/scripts/generate_initcall_order.pl \
|
|
vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
|
|
$(call if_changed,gen_initcalls_lds)
|
|
|
|
targets := .tmp_initcalls.lds
|
|
|
|
ifdef CONFIG_LTO_CLANG
|
|
initcalls-lds := .tmp_initcalls.lds
|
|
endif
|
|
|
|
# objtool for vmlinux.o
|
|
# ---------------------------------------------------------------------------
|
|
#
|
|
# For delay-objtool (IBT or LTO), objtool doesn't run on individual translation
|
|
# units. Instead it runs on vmlinux.o.
|
|
#
|
|
# For !delay-objtool + CONFIG_NOINSTR_VALIDATION, it runs on both translation
|
|
# units and vmlinux.o, with the latter only used for noinstr/unret validation.
|
|
|
|
objtool-enabled := $(or $(delay-objtool),$(CONFIG_NOINSTR_VALIDATION))
|
|
|
|
ifeq ($(delay-objtool),y)
|
|
vmlinux-objtool-args-y += $(objtool-args-y)
|
|
else
|
|
vmlinux-objtool-args-$(CONFIG_OBJTOOL_WERROR) += --Werror
|
|
endif
|
|
|
|
vmlinux-objtool-args-$(CONFIG_NOINSTR_VALIDATION) += --noinstr \
|
|
$(if $(or $(CONFIG_MITIGATION_UNRET_ENTRY),$(CONFIG_MITIGATION_SRSO)), --unret)
|
|
|
|
objtool-args = $(vmlinux-objtool-args-y) --link
|
|
|
|
# Link of vmlinux.o used for section mismatch analysis
|
|
# ---------------------------------------------------------------------------
|
|
|
|
vmlinux-o-ld-args-$(CONFIG_BUILTIN_MODULE_RANGES) += -Map=$@.map
|
|
|
|
quiet_cmd_ld_vmlinux.o = LD $@
|
|
cmd_ld_vmlinux.o = \
|
|
$(LD) ${KBUILD_LDFLAGS} -r -o $@ \
|
|
$(vmlinux-o-ld-args-y) \
|
|
$(addprefix -T , $(initcalls-lds)) \
|
|
--whole-archive vmlinux.a --no-whole-archive \
|
|
--start-group $(KBUILD_VMLINUX_LIBS) --end-group \
|
|
$(cmd_objtool)
|
|
|
|
define rule_ld_vmlinux.o
|
|
$(call cmd_and_savecmd,ld_vmlinux.o)
|
|
$(call cmd,gen_objtooldep)
|
|
endef
|
|
|
|
vmlinux.o: $(initcalls-lds) vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
|
|
$(call if_changed_rule,ld_vmlinux.o)
|
|
|
|
targets += vmlinux.o
|
|
|
|
# modules.builtin.modinfo
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# .modinfo in vmlinux.unstripped is aligned to 8 bytes for compatibility with
|
|
# tools that expect vmlinux to have sufficiently aligned sections but the
|
|
# additional bytes used for padding .modinfo to satisfy this requirement break
|
|
# certain versions of kmod with
|
|
#
|
|
# depmod: ERROR: kmod_builtin_iter_next: unexpected string without modname prefix
|
|
#
|
|
# Strip the trailing padding bytes after extracting .modinfo to comply with
|
|
# what kmod expects to parse.
|
|
quiet_cmd_modules_builtin_modinfo = GEN $@
|
|
cmd_modules_builtin_modinfo = $(cmd_objcopy); \
|
|
sed -i 's/\x00\+$$/\x00/g' $@
|
|
|
|
OBJCOPYFLAGS_modules.builtin.modinfo := -j .modinfo -O binary
|
|
|
|
targets += modules.builtin.modinfo
|
|
modules.builtin.modinfo: vmlinux.o FORCE
|
|
$(call if_changed,modules_builtin_modinfo)
|
|
|
|
# modules.builtin
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# The second line aids cases where multiple modules share the same object.
|
|
|
|
quiet_cmd_modules_builtin = GEN $@
|
|
cmd_modules_builtin = \
|
|
tr '\0' '\n' < $< | \
|
|
sed -n 's/^[[:alnum:]:_]*\.file=//p' | \
|
|
tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$$/.ko/' > $@
|
|
|
|
targets += modules.builtin
|
|
modules.builtin: modules.builtin.modinfo FORCE
|
|
$(call if_changed,modules_builtin)
|
|
|
|
# Add FORCE to the prerequisites 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)
|