From 35de7285d508d97e22aff18a9cdba21d52431e27 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Fri, 22 May 2026 08:16:25 +0200 Subject: [PATCH] Arm: do a 4th linking pass if necessary The .rodata growth between 1st and 2nd linking passes may affect the number of stubs the linker wants to insert, which in turn affects the number of symbols. If symbol table sizes change after the 2nd linking pass, insert another one before the final one. (As a comment in Linux puts it, "In theory it's possible this results in even more stubs, but unlikely.") To use the $(compare-symbol-tables) macro in a shell "if", it needs slightly adjusting (and then wrapping to be run in a sub-shell). Signed-off-by: Jan Beulich Reviewed-by: Anthony PERARD Acked-by: Bertrand Marquis --- xen/arch/arm/Makefile | 16 ++++++++++++++-- xen/scripts/Kbuild.include | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile index 982c6c396a..84c4062b30 100644 --- a/xen/arch/arm/Makefile +++ b/xen/arch/arm/Makefile @@ -99,9 +99,21 @@ $(TARGET)-syms: $(objtree)/prelink.o $(obj)/xen.lds | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \ > $(dot-target).2.S $(MAKE) $(build)=$(@D) $(dot-target).2.o - $(call compare-symbol-tables, $(dot-target).1.o, $(dot-target).2.o) + if ! { $(call compare-symbol-tables, $(dot-target).1.o, $(dot-target).2.o) >/dev/null; }; \ + then \ + set -e; \ + $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ + $(dot-target).2.o -o $(dot-target).2; \ + $(NM) -pa --format=sysv $(dot-target).2 \ + | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \ + > $(dot-target).3.S; \ + $(MAKE) $(build)=$(@D) $(dot-target).3.o; \ + $(call compare-symbol-tables, $(dot-target).2.o, $(dot-target).3.o); \ + else \ + ln -sf $(dot-target).2.o $(dot-target).3.o; \ + fi $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ - $(dot-target).2.o -o $@ + $(dot-target).3.o -o $@ $(NM) -pa --format=sysv $@ \ | $(objtree)/tools/symbols --all-symbols --xensyms --sysv --sort \ > $@.map diff --git a/xen/scripts/Kbuild.include b/xen/scripts/Kbuild.include index d5e36e7f55..41483513ac 100644 --- a/xen/scripts/Kbuild.include +++ b/xen/scripts/Kbuild.include @@ -65,7 +65,7 @@ define compare-symbol-tables $(OBJDUMP) -t $(@D)/.cst.$$$$ > $(1).sym; \ ln -f $(2) $(@D)/.cst.$$$$; \ $(OBJDUMP) -t $(@D)/.cst.$$$$ > $(2).sym; \ - rm -f $(@D)/.cst.$$$$ + rm -f $(@D)/.cst.$$$$; \ diff -u $(1).sym $(2).sym endef