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]> --- 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 + $(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; + } else if (strcmp(argv[i], "--xensyms") == 0) map_only = true; else usage();
