From 00a659a26c8b92cc47622fc75b9acb8fdf34fa5e Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Wed, 24 Jun 2026 15:56:20 +0200 Subject: [PATCH] x86/EFI: arrange for non-discardable .reloc in xen.efi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Loaders respecting IMAGE_SCN_MEM_DISCARDABLE would not load such sections, yet we need to access it ourselves when switching out of "physical mode". Leverage behavior new to GNU ld 2.46: Any contribution to .reloc which doesn't have the discardable flag set (which cannot even be expressed in ELF) will yield the output section also non-discardable. Since for intermediate binaries we don't care about section attributes, link in the new object only on the final linking pass. Reported-by: Yann Sionneau Signed-off-by: Jan Beulich Acked-by: Roger Pau Monné Acked-by: Marek Marczykowski-Górecki Release-Acked-by: Oleksii Kurochko --- xen/arch/x86/Makefile | 7 ++++--- xen/arch/x86/efi/Makefile | 2 +- xen/arch/x86/efi/relocs-empty.S | 8 ++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 xen/arch/x86/efi/relocs-empty.S diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile index 47dd6c50fe..c4c38516a7 100644 --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -196,7 +196,8 @@ note_file_option ?= $(note_file) extra-$(XEN_BUILD_PE) += efi.lds ifeq ($(XEN_BUILD_PE),y) -$(TARGET).efi: $(objtree)/prelink.o $(note_file) $(obj)/efi.lds $(obj)/efi/relocs-dummy.o $(obj)/efi/mkreloc +$(TARGET).efi: $(obj)/efi/relocs-dummy.o $(obj)/efi/relocs-empty.o $(obj)/efi/mkreloc +$(TARGET).efi: $(objtree)/prelink.o $(note_file) $(obj)/efi.lds ifeq ($(CONFIG_DEBUG_INFO),y) $(if $(filter --strip-debug,$(EFI_LDFLAGS)),echo,:) "Will strip debug info from $(@F)" endif @@ -227,7 +228,7 @@ endif $(MAKE) $(build)=$(@D) .$(@F).2r.o .$(@F).2s.o $(call compare-symbol-tables, $(dot-target).1r.o, $(dot-target).2r.o) $(call compare-symbol-tables, $(dot-target).1s.o, $(dot-target).2s.o) - $(LD) $(call EFI_LDFLAGS,$(VIRT_BASE)) -T $(obj)/efi.lds $< \ + $(LD) $(call EFI_LDFLAGS,$(VIRT_BASE)) -T $(obj)/efi.lds $< $(obj)/efi/relocs-empty.o \ $(dot-target).2r.o $(dot-target).2s.o $(orphan-handling-y) \ $(note_file_option) -o $@ $(NM) -pa --format=sysv $@ \ @@ -247,7 +248,7 @@ $(TARGET).efi: FORCE endif # These should already have been rebuilt when building the prerequisite of "prelink.o" -$(obj)/efi/buildid.o $(obj)/efi/relocs-dummy.o: ; +$(obj)/efi/buildid.o $(obj)/efi/relocs-dummy.o $(obj)/efi/relocs-empty.o: ; .PHONY: include include: $(objtree)/arch/x86/include/asm/asm-macros.h diff --git a/xen/arch/x86/efi/Makefile b/xen/arch/x86/efi/Makefile index 3e88f552d2..ad6cb6100e 100644 --- a/xen/arch/x86/efi/Makefile +++ b/xen/arch/x86/efi/Makefile @@ -17,5 +17,5 @@ obj-y := common-stub.o stub.o obj-$(XEN_BUILD_EFI) := $(filter-out %.init.o,$(EFIOBJ-y)) obj-bin-$(XEN_BUILD_EFI) := $(filter %.init.o,$(EFIOBJ-y)) obj-bin-y += mbi2.init.o -extra-$(XEN_BUILD_EFI) += buildid.o relocs-dummy.o +extra-$(XEN_BUILD_EFI) += buildid.o relocs-dummy.o relocs-empty.o nocov-$(XEN_BUILD_EFI) += stub.o diff --git a/xen/arch/x86/efi/relocs-empty.S b/xen/arch/x86/efi/relocs-empty.S new file mode 100644 index 0000000000..991bf2ca93 --- /dev/null +++ b/xen/arch/x86/efi/relocs-empty.S @@ -0,0 +1,8 @@ +/* + * Empty .reloc section, simply to indicate to GNU ld that the output .reloc + * section in xen.efi should not be marked IMAGE_SCN_MEM_DISCARDABLE. This + * requires GNU ld 2.46 or newer to actually be understood in the intended way. + */ + + .section .reloc, "a", @progbits + .balign 4