From: "Roger Pau Monné" <roger.pau@citrix.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
Andrew Cooper <andrew.cooper3@citrix.com>, Wei Liu <wl@xen.org>
Subject: Re: [PATCH 6/8] x86/EFI: avoid use of GNU ld's --disable-reloc-section when possible
Date: Wed, 21 Apr 2021 12:21:33 +0200 [thread overview]
Message-ID: <YH/8rb0aENMqOLAn@Air-de-Roger> (raw)
In-Reply-To: <ff15338a-ca10-ff38-3c2a-459303ce9d68@suse.com>
On Thu, Apr 01, 2021 at 11:46:44AM +0200, Jan Beulich wrote:
> As of commit 6fa7408d72b3 ("ld: don't generate base relocations in PE
> output for absolute symbols") I'm feeling sufficiently confident in GNU
> ld to use its logic for generating base relocations, which was enabled
> for executables at some point last year (prior to that this would have
> got done only for DLLs).
>
> GNU ld, seeing the original relocations coming from the ELF object files,
> generates different relocation types for our page tables (64-bit ones,
> while mkreloc produces 32-bit ones). This requires also permitting and
> handling that type in efi_arch_relocate_image().
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>
> --- a/xen/arch/x86/Makefile
> +++ b/xen/arch/x86/Makefile
> @@ -120,18 +120,37 @@ $(TARGET): $(TARGET)-syms $(efi-y) boot/
> mv $(TMP) $(TARGET)
>
> ifneq ($(efi-y),)
> +
> # Check if the compiler supports the MS ABI.
> export XEN_BUILD_EFI := $(shell $(CC) $(XEN_CFLAGS) -c efi/check.c -o efi/check.o 2>/dev/null && echo y)
> +CFLAGS-$(XEN_BUILD_EFI) += -DXEN_BUILD_EFI
> +
> # Check if the linker supports PE.
> EFI_LDFLAGS = $(patsubst -m%,-mi386pep,$(XEN_LDFLAGS)) --subsystem=10 --strip-debug
> XEN_BUILD_PE := $(if $(XEN_BUILD_EFI),$(shell $(LD) $(EFI_LDFLAGS) -o efi/check.efi efi/check.o 2>/dev/null && echo y))
> -CFLAGS-$(XEN_BUILD_EFI) += -DXEN_BUILD_EFI
> -# Check if the linker produces fixups in PE by default (we need to disable it doing so for now).
> -XEN_NO_PE_FIXUPS := $(if $(XEN_BUILD_EFI), \
> - $(shell $(LD) $(EFI_LDFLAGS) --disable-reloc-section -o efi/check.efi efi/check.o 2>/dev/null && \
> - echo --disable-reloc-section))
> +
> +ifeq ($(XEN_BUILD_PE),y)
> +
> +# Check if the linker produces fixups in PE by default
> +nr-fixups := $(shell $(OBJDUMP) -p efi/check.efi | grep '^[[:blank:]]*reloc[[:blank:]]*[0-9][[:blank:]].*DIR64$$' | wc -l)
> +ifeq ($(nr-fixups),2)
> +MKRELOC := :
> +relocs-dummy :=
> +else
> +MKRELOC := efi/mkreloc
> +relocs-dummy := efi/relocs-dummy.o
> +# If the linker produced fixups but not precisely two of them, we need to
> +# disable it doing so. But if it didn't produce any fixups, it also wouldn't
> +# recognize the option.
> +ifneq ($(nr-fixups),0)
> +EFI_LDFLAGS += --disable-reloc-section
> +endif
> endif
>
> +endif # $(XEN_BUILD_PE)
> +
> +endif # $(efi-y)
> +
> ALL_OBJS := $(BASEDIR)/arch/x86/boot/built_in.o $(BASEDIR)/arch/x86/efi/built_in.o $(ALL_OBJS)
>
> ifeq ($(CONFIG_LTO),y)
> @@ -175,7 +194,7 @@ note.o: $(TARGET)-syms
> --rename-section=.data=.note.gnu.build-id -S $@.bin $@
> rm -f $@.bin
>
> -EFI_LDFLAGS += --image-base=$(1) --stack=0,0 --heap=0,0 $(XEN_NO_PE_FIXUPS)
> +EFI_LDFLAGS += --image-base=$(1) --stack=0,0 --heap=0,0
> EFI_LDFLAGS += --section-alignment=0x200000 --file-alignment=0x20
> EFI_LDFLAGS += --major-image-version=$(XEN_VERSION)
> EFI_LDFLAGS += --minor-image-version=$(XEN_SUBVERSION)
> @@ -189,7 +208,11 @@ EFI_LDFLAGS += --no-insert-timestamp
> endif
>
> $(TARGET).efi: VIRT_BASE = 0x$(shell $(NM) efi/relocs-dummy.o | sed -n 's, A VIRT_START$$,,p')
> +ifeq ($(MKRELOC),:)
> +$(TARGET).efi: ALT_BASE :=
> +else
> $(TARGET).efi: ALT_BASE = 0x$(shell $(NM) efi/relocs-dummy.o | sed -n 's, A ALT_START$$,,p')
Could you maybe check whether $(relocs-dummy) is set as the condition
here and use it here instead of efi/relocs-dummy.o?
> +endif
>
> ifneq ($(build_id_linker),)
> ifeq ($(call ld-ver-build-id,$(LD) $(filter -m%,$(EFI_LDFLAGS))),y)
> @@ -210,16 +233,16 @@ note_file_option ?= $(note_file)
> ifeq ($(XEN_BUILD_PE),y)
> $(TARGET).efi: prelink.o $(note_file) efi.lds efi/relocs-dummy.o efi/mkreloc
Do you need to also replace the target prerequisite to use $(relocs-dummy)?
> $(foreach base, $(VIRT_BASE) $(ALT_BASE), \
> - $(LD) $(call EFI_LDFLAGS,$(base)) -T efi.lds -N $< efi/relocs-dummy.o \
> + $(LD) $(call EFI_LDFLAGS,$(base)) -T efi.lds -N $< $(relocs-dummy) \
> $(BASEDIR)/common/symbols-dummy.o $(note_file_option) -o $(@D)/.$(@F).$(base).0 &&) :
> - efi/mkreloc $(foreach base,$(VIRT_BASE) $(ALT_BASE),$(@D)/.$(@F).$(base).0) >$(@D)/.$(@F).0r.S
> + $(MKRELOC) $(foreach base,$(VIRT_BASE) $(ALT_BASE),$(@D)/.$(@F).$(base).0) >$(@D)/.$(@F).0r.S
> $(NM) -pa --format=sysv $(@D)/.$(@F).$(VIRT_BASE).0 \
> | $(BASEDIR)/tools/symbols $(all_symbols) --sysv --sort >$(@D)/.$(@F).0s.S
> $(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).0r.o $(@D)/.$(@F).0s.o
> $(foreach base, $(VIRT_BASE) $(ALT_BASE), \
> $(LD) $(call EFI_LDFLAGS,$(base)) -T efi.lds -N $< \
> $(@D)/.$(@F).0r.o $(@D)/.$(@F).0s.o $(note_file_option) -o $(@D)/.$(@F).$(base).1 &&) :
> - efi/mkreloc $(foreach base,$(VIRT_BASE) $(ALT_BASE),$(@D)/.$(@F).$(base).1) >$(@D)/.$(@F).1r.S
> + $(MKRELOC) $(foreach base,$(VIRT_BASE) $(ALT_BASE),$(@D)/.$(@F).$(base).1) >$(@D)/.$(@F).1r.S
> $(NM) -pa --format=sysv $(@D)/.$(@F).$(VIRT_BASE).1 \
> | $(BASEDIR)/tools/symbols $(all_symbols) --sysv --sort >$(@D)/.$(@F).1s.S
> $(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).1r.o $(@D)/.$(@F).1s.o
> --- a/xen/arch/x86/efi/check.c
> +++ b/xen/arch/x86/efi/check.c
> @@ -2,3 +2,17 @@ int __attribute__((__ms_abi__)) test(int
> {
> return i;
> }
> +
> +/*
> + * Populate an array with "addresses" of relocatable and absolute values.
> + * This is to probe ld for (a) emitting base relocations at all and (b) not
> + * emitting base relocations for absolute symbols.
> + */
> +extern const unsigned char __image_base__[], __file_alignment__[],
> + __section_alignment__[];
> +const void *const data[] = {
> + __image_base__,
> + __file_alignment__,
> + __section_alignment__,
> + data,
> +};
> --- a/xen/arch/x86/efi/efi-boot.h
> +++ b/xen/arch/x86/efi/efi-boot.h
> @@ -86,10 +86,12 @@ static void __init efi_arch_relocate_ima
> }
> break;
> case PE_BASE_RELOC_DIR64:
> - if ( in_page_tables(addr) )
> - blexit(L"Unexpected relocation type");
> if ( delta )
> + {
> *(u64 *)addr += delta;
> + if ( in_page_tables(addr) )
> + *(u64 *)addr += xen_phys_start;
Doesn't the in_page_tables check and modification also apply when
delta == 0?
Maybe you could just break on !delta to reduce indentation if none of
this applies then?
Thanks, Roger.
next prev parent reply other threads:[~2021-04-21 10:21 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-01 9:43 [PATCH 0/8] x86/EFI: build adjustments Jan Beulich
2021-04-01 9:44 ` [PATCH 1/8] x86/EFI: drop stale section special casing when generating base relocs Jan Beulich
2021-04-01 11:51 ` Andrew Cooper
2021-04-01 9:44 ` [PATCH 2/8] x86/EFI: sections may not live at VA 0 in PE binaries Jan Beulich
2021-04-01 12:01 ` Andrew Cooper
2021-04-01 13:51 ` Jan Beulich
2021-04-21 8:52 ` Roger Pau Monné
2021-04-21 10:32 ` Jan Beulich
2021-04-21 12:57 ` Roger Pau Monné
2021-04-21 13:28 ` Jan Beulich
2021-04-01 9:45 ` [PATCH 3/8] x86/EFI: program headers are an ELF concept Jan Beulich
2021-04-21 9:11 ` Roger Pau Monné
2021-04-21 10:36 ` Jan Beulich
2021-04-21 14:21 ` Roger Pau Monné
2021-04-21 14:30 ` Jan Beulich
2021-04-01 9:45 ` [PATCH 4/8] x86/EFI: redo .reloc section bounds determination Jan Beulich
2021-04-21 9:46 ` Roger Pau Monné
2021-04-21 10:44 ` Jan Beulich
2021-04-21 14:54 ` Roger Pau Monné
2021-04-01 9:46 ` [PATCH 5/8] x86: drop use of prelink-efi.o Jan Beulich
2021-04-21 9:51 ` Roger Pau Monné
2021-04-01 9:46 ` [PATCH 6/8] x86/EFI: avoid use of GNU ld's --disable-reloc-section when possible Jan Beulich
2021-04-21 10:21 ` Roger Pau Monné [this message]
2021-04-21 12:03 ` Jan Beulich
2021-04-21 15:20 ` Roger Pau Monné
2021-04-21 15:34 ` Jan Beulich
2021-04-22 7:22 ` Roger Pau Monné
2021-04-22 10:42 ` Jan Beulich
2021-04-01 9:47 ` [PATCH 7/8] x86/EFI: keep debug info in xen.efi Jan Beulich
2021-04-21 11:15 ` Roger Pau Monné
2021-04-21 13:06 ` Jan Beulich
2021-04-21 15:30 ` Roger Pau Monné
2021-04-21 15:38 ` Jan Beulich
2021-04-22 8:14 ` Roger Pau Monné
2021-04-22 11:03 ` Jan Beulich
2021-04-22 14:56 ` Roger Pau Monné
2021-04-22 15:46 ` Jan Beulich
2021-04-22 15:53 ` Roger Pau Monné
2021-04-22 16:01 ` Jan Beulich
2021-04-23 7:30 ` Roger Pau Monné
2021-04-23 8:51 ` Jan Beulich
2021-04-23 10:07 ` Roger Pau Monné
2021-04-23 10:45 ` Jan Beulich
2021-04-23 10:58 ` Roger Pau Monné
2021-04-01 9:47 ` [PATCH 8/8] x86/EFI: don't have an overly large image size Jan Beulich
2021-04-21 11:18 ` Roger Pau Monné
2021-04-21 13:15 ` Jan Beulich
2021-04-15 9:53 ` Ping: [PATCH 0/8] x86/EFI: build adjustments Jan Beulich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YH/8rb0aENMqOLAn@Air-de-Roger \
--to=roger.pau@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).