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))
+EFI_LDFLAGS = $(patsubst -m%,-mi386pep,$(XEN_LDFLAGS)) --subsystem=10
+XEN_BUILD_PE := $(if $(XEN_BUILD_EFI),$(call ld-option,$(EFI_LDFLAGS) --image-base=0x100000000 -o efi/check.efi efi/check.o))
+# If the above failed, it may be merely because of the linker not dealing well
+# with debug info. Try again with stripping it.
+ifeq ($(CONFIG_DEBUG_INFO)-$(XEN_BUILD_PE),y-n)
+EFI_LDFLAGS += --strip-debug
+XEN_BUILD_PE := $(call ld-option,$(EFI_LDFLAGS) --image-base=0x100000000 -o efi/check.efi efi/check.o)
+endif
ifeq ($(XEN_BUILD_PE),y)
ifeq ($(XEN_BUILD_PE),y)
$(TARGET).efi: prelink.o $(note_file) efi.lds efi/relocs-dummy.o efi/mkreloc
+ifeq ($(CONFIG_DEBUG_INFO),y)
+ $(if $(filter --strip-debug,$(EFI_LDFLAGS)),echo,:) "Will strip debug info from $(@F)"
+endif
$(foreach base, $(VIRT_BASE) $(ALT_BASE), \
$(LD) $(call EFI_LDFLAGS,$(base)) -T efi.lds -N $< $(relocs-dummy) \
$(BASEDIR)/common/symbols-dummy.o $(note_file_option) -o $(@D)/.$(@F).$(base).0 &&) :
*(.reloc)
__base_relocs_end = .;
}
- /* Trick the linker into setting the image size to exactly 16Mb. */
- . = ALIGN(__section_alignment__);
- DECL_SECTION(.pad) {
- . = ALIGN(MB(16));
+ /*
+ * Explicitly list debug section for the PE output so that they don't end
+ * up at VA 0 which is below image base and thus invalid. Also use the
+ * NOLOAD directive, despite currently ignored by ld for PE output, in
+ * order to record that we'd prefer these sections to not be loaded into
+ * memory.
+ *
+ * Note that we're past _end here, so if these sections get loaded they'll
+ * be discarded at runtime anyway.
+ */
+ .debug_abbrev ALIGN(1) (NOLOAD) : {
+ *(.debug_abbrev)
+ }
+ .debug_info ALIGN(1) (NOLOAD) : {
+ *(.debug_info)
+ *(.gnu.linkonce.wi.*)
+ }
+ .debug_types ALIGN(1) (NOLOAD) : {
+ *(.debug_types)
+ }
+ .debug_str ALIGN(1) (NOLOAD) : {
+ *(.debug_str)
+ }
+ .debug_line ALIGN(1) (NOLOAD) : {
+ *(.debug_line)
+ *(.debug_line.*)
+ }
+ .debug_line_str ALIGN(1) (NOLOAD) : {
+ *(.debug_line_str)
+ }
+ .debug_names ALIGN(4) (NOLOAD) : {
+ *(.debug_names)
+ }
+ .debug_frame ALIGN(4) (NOLOAD) : {
+ *(.debug_frame)
+ }
+ .debug_loc ALIGN(1) (NOLOAD) : {
+ *(.debug_loc)
+ }
+ .debug_loclists ALIGN(4) (NOLOAD) : {
+ *(.debug_loclists)
+ }
+ .debug_ranges ALIGN(8) (NOLOAD) : {
+ *(.debug_ranges)
+ }
+ .debug_rnglists ALIGN(4) (NOLOAD) : {
+ *(.debug_rnglists)
+ }
+ .debug_addr ALIGN(8) (NOLOAD) : {
+ *(.debug_addr)
+ }
+ .debug_aranges ALIGN(1) (NOLOAD) : {
+ *(.debug_aranges)
+ }
+ .debug_pubnames ALIGN(1) (NOLOAD) : {
+ *(.debug_pubnames)
+ }
+ .debug_pubtypes ALIGN(1) (NOLOAD) : {
+ *(.debug_pubtypes)
+ }
+ /* Trick the linker into setting the image size to no less than 16Mb. */
+ __image_end__ = .;
+ .pad ALIGN(__section_alignment__) : {
+ . = __image_end__ < __image_base__ + MB(16) ? ALIGN(MB(16)) : .;
}
#elif defined(XEN_BUILD_EFI)
/*