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 <jbeulich@suse.com>
Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
Acked-by: Bertrand Marquis <bertrand.marquis@arm.com>
This commit is contained in:
Jan Beulich committed 2026-05-22 08:16:25 +02:00
1 parent b74e973b96
commit 35de7285d5
2 files changed
+15 -3

No files matched your search

+14 -2
View File
@@ -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
+1 -1
View File
@@ -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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.