Re: [PATCH v7 3/8] kbuild: keep .modinfo section in vmlinux.unstripped
From: Nicolas Schier <nsc@kernel.org>
Date: 2025-09-16 12:43:00
Also in:
linux-kbuild, lkml
Subsystem:
kernel build + files below scripts/ (unless maintained elsewhere), the rest · Maintainers:
Nathan Chancellor, Nicolas Schier, Linus Torvalds
On Tue, Sep 16, 2025 at 01:30:20PM +0200, Alexey Gladkov wrote:
quoted hunk ↗ jump to hunk
On Tue, Sep 16, 2025 at 11:36:54AM +0200, Nicolas Schier wrote:quoted
On Tue, Sep 16, 2025 at 09:12:22AM +0200, Alexey Gladkov wrote:quoted
On Mon, Sep 15, 2025 at 07:56:16AM +0200, Nicolas Schier wrote:quoted
On Mon, Aug 18, 2025 at 06:54:57PM +0200, Alexey Gladkov wrote:quoted
From: Masahiro Yamada <masahiroy@kernel.org> Keep the .modinfo section during linking, but strip it from the final vmlinux. Adjust scripts/mksysmap to exclude modinfo symbols from kallsyms. This change will allow the next commit to extract the .modinfo section from the vmlinux.unstripped intermediate. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> --- include/asm-generic/vmlinux.lds.h | 2 +- scripts/Makefile.vmlinux | 2 +- scripts/mksysmap | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-)diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index ae2d2359b79e9..cfa63860dfd4c 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h@@ -831,6 +831,7 @@ defined(CONFIG_AUTOFDO_CLANG) || defined(CONFIG_PROPELLER_CLANG) /* Required sections not related to debugging. */ #define ELF_DETAILS \ + .modinfo : { *(.modinfo) } \ .comment 0 : { *(.comment) } \ .symtab 0 : { *(.symtab) } \ .strtab 0 : { *(.strtab) } \@@ -1044,7 +1045,6 @@ defined(CONFIG_AUTOFDO_CLANG) || defined(CONFIG_PROPELLER_CLANG) *(.discard.*) \ *(.export_symbol) \ *(.no_trim_symbol) \ - *(.modinfo) \ /* ld.bfd warns about .gnu.version* even when not emitted */ \ *(.gnu.version*) \diff --git a/scripts/Makefile.vmlinux b/scripts/Makefile.vmlinux index 4f2d4c3fb7372..e2ceeb9e168d4 100644 --- a/scripts/Makefile.vmlinux +++ b/scripts/Makefile.vmlinux@@ -86,7 +86,7 @@ endif # vmlinux # --------------------------------------------------------------------------- -remove-section-y := +remove-section-y := .modinfo remove-section-$(CONFIG_ARCH_VMLINUX_NEEDS_RELOCS) += '.rel*' quiet_cmd_strip_relocs = OBJCOPY $@diff --git a/scripts/mksysmap b/scripts/mksysmap index 3accbdb269ac7..a607a0059d119 100755 --- a/scripts/mksysmap +++ b/scripts/mksysmap@@ -79,6 +79,9 @@ / _SDA_BASE_$/d / _SDA2_BASE_$/d +# MODULE_INFO() +/ __UNIQUE_ID_modinfo[0-9]*$/d + # --------------------------------------------------------------------------- # Ignored patterns # (symbols that contain the pattern are ignored)-- 2.50.1Hi Alexey, with this patch applied, I still get a warning from objcpy as Masahiro and Stephen wrote [1,2] SORTTAB vmlinux.unstripped + sorttable vmlinux.unstripped + nm -S vmlinux.unstripped + ./scripts/sorttable -s .tmp_vmlinux.nm-sort vmlinux.unstripped + is_enabled CONFIG_KALLSYMS + grep -q ^CONFIG_KALLSYMS=y include/config/auto.conf + cmp -s System.map .tmp_vmlinux2.syms + echo vmlinux.unstripped: ../scripts/link-vmlinux.sh # OBJCOPY vmlinux objcopy --remove-section=.modinfo vmlinux.unstripped vmlinux objcopy: vmlinux.unstripped: warning: empty loadable segment detected at vaddr=0xffff8000807a0000, is this intentional? (arm64, allnoconfig) Kind regards, Nicolas [1]: https://lore.kernel.org/linux-kbuild/CAK7LNAR-gD2H6Kk-rZjo0R3weTHCGTm0a=u2tRH1WWW6Sx6=RQ@mail.gmail.com/ (local) [2]: https://lore.kernel.org/lkml/20250730164047.7c4a731a@canb.auug.org.au/ (local)Hm. I missed that. I need to investigate how to fix this. Nothing comes to mind right now.Same here. Only thing I could find until now is https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/diff/scripts/link-vmlinux.sh?id=90ceddcb495008ac8ba7a3dce297841efcd7d584 where '2>/dev/null' is appended exactly to prevent this very warning. But for me, it doesn't feel good doing that when stripping to vmlinux.Yes, that's not a very good approach. It will hide other errors that will definitely need to be seen. I think the commit you mentioned is actually incorrect. I think there should be a different solution. I think in the case of .modinfo, we can change the flag in the section since we are going to delete it anyway.diff --git a/scripts/Makefile.vmlinux b/scripts/Makefile.vmlinux index dbbe3bf0cf23..9a118b31d0dc 100644 --- a/scripts/Makefile.vmlinux +++ b/scripts/Makefile.vmlinux@@ -87,7 +87,8 @@ remove-section-$(CONFIG_ARCH_VMLINUX_NEEDS_RELOCS) += '.rel*' remove-symbols := -w --strip-symbol='__mod_device_table__*' quiet_cmd_strip_relocs = OBJCOPY $@ - cmd_strip_relocs = $(OBJCOPY) $(addprefix --remove-section=,$(remove-section-y)) \ + cmd_strip_relocs = $(OBJCOPY) $(patsubst %,--set-section-flags %=noload,$(remove-section-y)) $< && \ + $(OBJCOPY) $(addprefix --remove-section=,$(remove-section-y)) \ $(remove-symbols) $< $@ targets += vmlinux
Ah, great! I thought we had to fiddle around with linker scripts et al. I needed to use an intermediate file:
diff --git a/scripts/Makefile.vmlinux b/scripts/Makefile.vmlinux
index e2ceeb9e168d..516d51ca634b 100644
--- a/scripts/Makefile.vmlinux
+++ b/scripts/Makefile.vmlinux@@ -90,6 +90,9 @@ remove-section-y := .modinfo remove-section-$(CONFIG_ARCH_VMLINUX_NEEDS_RELOCS) += '.rel*' quiet_cmd_strip_relocs = OBJCOPY $@ - cmd_strip_relocs = $(OBJCOPY) $(addprefix --remove-section=,$(remove-section-y)) $< $@ + cmd_strip_relocs = set -e; \ + trap 'rm $<.noload' EXIT HUP INT; \ + $(OBJCOPY) $(patsubst %,--set-section-flags %=noload,$(remove-section-y)) $< $<.noload && \ + $(OBJCOPY) $(addprefix --remove-section=,$(remove-section-y)) $<.noload $@ targets += vmlinux
Kind regards, Nicolas