mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 13:30:45 -05:00
Prior to binutils commit c12d9fa2afe ("Support objcopy
--remove-section=.relaFOO") [1] in 2.32, stripping relocation sections
required the trailing period (i.e., '.rel.*') to work properly.
After commit 3e86e4d74c ("kbuild: keep .modinfo section in
vmlinux.unstripped"), there is an error with binutils 2.31.1 or earlier
because these sections are not properly removed:
s390-linux-objcopy: st6tO8Ev: symbol `.modinfo' required but not present
s390-linux-objcopy:st6tO8Ev: no symbols
Add the old pattern to resolve this issue (along with a comment to allow
cleaning this when binutils 2.32 or newer is the minimum supported
version). While the aforementioned kbuild change exposes this, the
pattern was originally changed by commit 71d815bf5d ("kbuild: Strip
runtime const RELA sections correctly"), where it would still be
incorrect with binutils older than 2.32.
Fixes: 71d815bf5d ("kbuild: Strip runtime const RELA sections correctly")
Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=c12d9fa2afe7abcbe407a00e15719e1a1350c2a7 [1]
Reported-by: Linux Kernel Functional Testing <lkft@linaro.org>
Closes: https://lore.kernel.org/CA+G9fYvVktRhFtZXdNgVOL8j+ArsJDpvMLgCitaQvQmCx=hwOQ@mail.gmail.com/
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Acked-by: Alexey Gladkov <legion@kernel.org>
Acked-by: Nicolas Schier <nsc@kernel.org>
Link: https://patch.msgid.link/20251008-kbuild-fix-modinfo-regressions-v1-2-9fc776c5887c@kernel.org
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
162 lines
5.1 KiB
Makefile
162 lines
5.1 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
PHONY := __default
|
|
__default: vmlinux
|
|
|
|
include include/config/auto.conf
|
|
include $(srctree)/scripts/Kbuild.include
|
|
include $(srctree)/scripts/Makefile.lib
|
|
|
|
targets :=
|
|
|
|
%.o: %.c FORCE
|
|
$(call if_changed_rule,cc_o_c)
|
|
|
|
%.o: %.S FORCE
|
|
$(call if_changed_rule,as_o_S)
|
|
|
|
# Built-in dtb
|
|
# ---------------------------------------------------------------------------
|
|
|
|
quiet_cmd_wrap_dtbs = WRAP $@
|
|
cmd_wrap_dtbs = { \
|
|
echo '\#include <asm-generic/vmlinux.lds.h>'; \
|
|
echo '.section .dtb.init.rodata,"a"'; \
|
|
while read dtb; do \
|
|
symbase=__dtb_$$(basename -s .dtb "$${dtb}" | tr - _); \
|
|
echo '.balign STRUCT_ALIGNMENT'; \
|
|
echo ".global $${symbase}_begin"; \
|
|
echo "$${symbase}_begin:"; \
|
|
echo '.incbin "'$$dtb'" '; \
|
|
echo ".global $${symbase}_end"; \
|
|
echo "$${symbase}_end:"; \
|
|
done < $<; \
|
|
} > $@
|
|
|
|
.builtin-dtbs.S: .builtin-dtbs-list FORCE
|
|
$(call if_changed,wrap_dtbs)
|
|
|
|
quiet_cmd_gen_dtbs_list = GEN $@
|
|
cmd_gen_dtbs_list = \
|
|
$(if $(CONFIG_BUILTIN_DTB_NAME), echo "arch/$(SRCARCH)/boot/dts/$(CONFIG_BUILTIN_DTB_NAME).dtb",:) > $@
|
|
|
|
.builtin-dtbs-list: arch/$(SRCARCH)/boot/dts/dtbs-list FORCE
|
|
$(call if_changed,$(if $(CONFIG_BUILTIN_DTB_ALL),copy,gen_dtbs_list))
|
|
|
|
targets += .builtin-dtbs-list
|
|
|
|
ifdef CONFIG_GENERIC_BUILTIN_DTB
|
|
targets += .builtin-dtbs.S .builtin-dtbs.o
|
|
vmlinux.unstripped: .builtin-dtbs.o
|
|
endif
|
|
|
|
# vmlinux.unstripped
|
|
# ---------------------------------------------------------------------------
|
|
|
|
ifdef CONFIG_ARCH_WANTS_PRE_LINK_VMLINUX
|
|
vmlinux.unstripped: arch/$(SRCARCH)/tools/vmlinux.arch.o
|
|
|
|
arch/$(SRCARCH)/tools/vmlinux.arch.o: vmlinux.o FORCE
|
|
$(Q)$(MAKE) $(build)=arch/$(SRCARCH)/tools $@
|
|
endif
|
|
|
|
ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
|
|
|
|
# Final link of vmlinux with optional arch pass after final link
|
|
cmd_link_vmlinux = \
|
|
$< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)" "$@"; \
|
|
$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
|
|
|
|
targets += vmlinux.unstripped .vmlinux.export.o
|
|
vmlinux.unstripped: scripts/link-vmlinux.sh vmlinux.o .vmlinux.export.o $(KBUILD_LDS) FORCE
|
|
+$(call if_changed_dep,link_vmlinux)
|
|
ifdef CONFIG_DEBUG_INFO_BTF
|
|
vmlinux.unstripped: $(RESOLVE_BTFIDS)
|
|
endif
|
|
|
|
ifdef CONFIG_BUILDTIME_TABLE_SORT
|
|
vmlinux.unstripped: scripts/sorttable
|
|
endif
|
|
|
|
# vmlinux
|
|
# ---------------------------------------------------------------------------
|
|
|
|
remove-section-y := .modinfo
|
|
remove-section-$(CONFIG_ARCH_VMLINUX_NEEDS_RELOCS) += '.rel*' '!.rel*.dyn'
|
|
# for compatibility with binutils < 2.32
|
|
# https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=c12d9fa2afe7abcbe407a00e15719e1a1350c2a7
|
|
remove-section-$(CONFIG_ARCH_VMLINUX_NEEDS_RELOCS) += '.rel.*'
|
|
|
|
remove-symbols := -w --strip-symbol='__mod_device_table__*'
|
|
|
|
# To avoid warnings: "empty loadable segment detected at ..." from GNU objcopy,
|
|
# it is necessary to remove the PT_LOAD flag from the segment.
|
|
quiet_cmd_strip_relocs = OBJCOPY $@
|
|
cmd_strip_relocs = $(OBJCOPY) $(patsubst %,--set-section-flags %=noload,$(remove-section-y)) $< $@; \
|
|
$(OBJCOPY) $(addprefix --remove-section=,$(remove-section-y)) $(remove-symbols) $@
|
|
|
|
targets += vmlinux
|
|
vmlinux: vmlinux.unstripped FORCE
|
|
$(call if_changed,strip_relocs)
|
|
|
|
# modules.builtin.modinfo
|
|
# ---------------------------------------------------------------------------
|
|
|
|
OBJCOPYFLAGS_modules.builtin.modinfo := -j .modinfo -O binary
|
|
|
|
targets += modules.builtin.modinfo
|
|
modules.builtin.modinfo: vmlinux.unstripped FORCE
|
|
$(call if_changed,objcopy)
|
|
|
|
# modules.builtin
|
|
# ---------------------------------------------------------------------------
|
|
|
|
__default: 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)
|
|
|
|
# modules.builtin.ranges
|
|
# ---------------------------------------------------------------------------
|
|
ifdef CONFIG_BUILTIN_MODULE_RANGES
|
|
__default: modules.builtin.ranges
|
|
|
|
quiet_cmd_modules_builtin_ranges = GEN $@
|
|
cmd_modules_builtin_ranges = gawk -f $(real-prereqs) > $@
|
|
|
|
targets += modules.builtin.ranges
|
|
modules.builtin.ranges: $(srctree)/scripts/generate_builtin_ranges.awk \
|
|
modules.builtin vmlinux.map vmlinux.o.map FORCE
|
|
$(call if_changed,modules_builtin_ranges)
|
|
|
|
vmlinux.map: vmlinux.unstripped
|
|
@:
|
|
|
|
endif
|
|
|
|
# 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)
|