On Tue, Nov 25, 2025 at 03:14:27PM +0100, Jan Beulich wrote:
> In particular when linking with lld, which converts hidden symbols to
> local ones, the ELF symbol table can change in unhelpful ways between the
> first two linking passes, resulting in the .rodata contributions to change
> between the 2nd and 3rd pass. That, however, renders our embedded symbol
> table pretty much unusable; the recently introduced self-test may then
> also fail. (Another difference between compiling a C file and assembling
> the generated ones is that - with -fdata-sections in use - the .rodata
> contributions move between passes 1 and 2, when we'd prefer them not to.)
> 
> Make tools/symbols capable of producing an "empty" assembly file, such
> that unwanted differences between passes 1 and 2 go away when then using
> the corresponding objects in place of common/symbols-dummy.o.
> 
> Reported-by: Andrew Cooper <[email protected]>
> Reported-by: Roger Pau Monné <[email protected]>
> Signed-off-by: Jan Beulich <[email protected]>

LGTM, not sure whether you want to extend to other arches in this
same patch, or simply guard the build of symbols-dummy.o for non-x86
arches.

> ---
> May want mirroring to other arch-es.
> 
> --- a/xen/arch/x86/Makefile
> +++ b/xen/arch/x86/Makefile
> @@ -134,8 +134,10 @@ $(TARGET): $(TARGET)-syms $(efi-y) $(obj
>  CFLAGS-$(XEN_BUILD_EFI) += -DXEN_BUILD_EFI
>  
>  $(TARGET)-syms: $(objtree)/prelink.o $(obj)/xen.lds
> +     $(objtree)/tools/symbols $(all_symbols) --empty > $(dot-target).0.S
> +     $(MAKE) $(build)=$(@D) $(dot-target).0.o
>       $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \
> -         $(objtree)/common/symbols-dummy.o -o $(dot-target).0

It would be good if we could now stop building symbols-dummy.o as part
of extra-y.  Maybe you could guard it with ifneq ($(CONFIG_X86),y) in
the Makefile?

Or otherwise remove this from all arches thus removing
common/symbols-dummy.c.

> +           $(dot-target).0.o -o $(dot-target).0
>       $(NM) -pa --format=sysv $(dot-target).0 \
>               | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \
>               > $(dot-target).1.S
> @@ -207,9 +209,11 @@ $(TARGET).efi: $(objtree)/prelink.o $(no
>  ifeq ($(CONFIG_DEBUG_INFO),y)
>       $(if $(filter --strip-debug,$(EFI_LDFLAGS)),echo,:) "Will strip debug 
> info from $(@F)"
>  endif
> +     $(objtree)/tools/symbols $(all_symbols) --empty > $(dot-target).0s.S
> +     $(MAKE) $(build)=$(@D) .$(@F).0s.o
>       $(foreach base, $(VIRT_BASE) $(ALT_BASE), \
>                 $(LD) $(call EFI_LDFLAGS,$(base)) -T $(obj)/efi.lds $< 
> $(relocs-dummy) \
> -                     $(objtree)/common/symbols-dummy.o $(note_file_option) \
> +                     $(dot-target).0s.o $(note_file_option) \
>                       -o $(dot-target).$(base).0 &&) :
>       $(MKRELOC) $(foreach base,$(VIRT_BASE) 
> $(ALT_BASE),$(dot-target).$(base).0) \
>               > $(dot-target).1r.S
> --- a/xen/tools/symbols.c
> +++ b/xen/tools/symbols.c
> @@ -672,7 +672,10 @@ int main(int argc, char **argv)
>                               warn_dup = true;
>                       else if (strcmp(argv[i], "--error-dup") == 0)
>                               warn_dup = error_dup = true;
> -                     else if (strcmp(argv[i], "--xensyms") == 0)
> +                     else if (strcmp(argv[i], "--empty") == 0) {
> +                             write_src();
> +                             return 0;

Oh, that was easier than I was expecting for symbols to generate a
working empty assembly file.

Thanks, Roger.

Reply via email to