[PATCH 11/31] sandbox: Provide an EFI link script for PE

Simon Glass sjg at chromium.org
Tue Apr 25 01:08:16 CEST 2023


Add another case for sandbox, when it is built on Windows.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 arch/sandbox/config.mk         |  4 +-
 arch/x86/lib/crt0_x86_64_efi.S |  2 +
 arch/x86/lib/pe_x86_64_efi.lds | 83 ++++++++++++++++++++++++++++++++++
 3 files changed, 88 insertions(+), 1 deletion(-)
 create mode 100644 arch/x86/lib/pe_x86_64_efi.lds

diff --git a/arch/sandbox/config.mk b/arch/sandbox/config.mk
index e05daf57ef8e..3269e6f3d2ce 100644
--- a/arch/sandbox/config.mk
+++ b/arch/sandbox/config.mk
@@ -44,7 +44,9 @@ cmd_u-boot-spl = (cd $(obj) && $(CC) -o $(SPL_BIN) -Wl,-T u-boot-spl.lds \
 	-Wl,--no-whole-archive \
 	$(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot-spl.map -Wl,--gc-sections)
 
-ifeq ($(HOST_ARCH),$(HOST_ARCH_X86_64))
+ifneq ($(MSYS_VERSION),0)
+EFI_LDS := ${SRCDIR}/../../../arch/x86/lib/pe_x86_64_efi.lds
+else ifeq ($(HOST_ARCH),$(HOST_ARCH_X86_64))
 EFI_LDS := ${SRCDIR}/../../../arch/x86/lib/elf_x86_64_efi.lds
 EFI_TARGET := --target=efi-app-x86_64
 else ifeq ($(HOST_ARCH),$(HOST_ARCH_X86))
diff --git a/arch/x86/lib/crt0_x86_64_efi.S b/arch/x86/lib/crt0_x86_64_efi.S
index 47ed5af97228..cd61b4bdd82f 100644
--- a/arch/x86/lib/crt0_x86_64_efi.S
+++ b/arch/x86/lib/crt0_x86_64_efi.S
@@ -15,6 +15,7 @@
 _start:
 	subq $8, %rsp
 
+#ifndef __CYGWIN__
 	pushq %rcx
 	pushq %rdx
 
@@ -28,6 +29,7 @@ _start:
 
 	testq %rax, %rax
 	jnz .exit
+#endif
 
 	call efi_main
 .exit:
diff --git a/arch/x86/lib/pe_x86_64_efi.lds b/arch/x86/lib/pe_x86_64_efi.lds
new file mode 100644
index 000000000000..1ee08f6e662e
--- /dev/null
+++ b/arch/x86/lib/pe_x86_64_efi.lds
@@ -0,0 +1,83 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*
+ * U-Boot EFI linker script
+ *
+ * Modified from usr/lib32/elf_x86_64_efi.lds in gnu-efi
+ */
+
+OUTPUT_FORMAT("pe-x86-64", "pe-x86-64", "pe-x86-64")
+OUTPUT_ARCH(i386:x86-64)
+ENTRY(_start)
+SECTIONS
+{
+	image_base = .;
+	.hash : { *(.hash) }	/* this MUST come first, EFI expects it */
+	. = ALIGN(4096);
+	.eh_frame : {
+		*(.eh_frame)
+	}
+
+	. = ALIGN(4096);
+
+	.text : {
+		*(.text)
+		*(.text.*)
+		*(.gnu.linkonce.t.*)
+	}
+
+	. = ALIGN(4096);
+
+	.reloc : {
+		*(.reloc)
+	}
+
+	. = ALIGN(4096);
+
+	.data : {
+		*(.rodata*)
+		*(.got.plt)
+		*(.got)
+		*(.data*)
+		*(.sdata)
+		/* the EFI loader doesn't seem to like a .bss section, so we stick
+		 * it all into .data: */
+		*(.sbss)
+		*(.scommon)
+		*(.dynbss)
+		*(.bss*)
+		*(COMMON)
+		*(.rel.local)
+
+		/* U-Boot lists and device tree */
+		. = ALIGN(8);
+		*(SORT(__u_boot_list*));
+		. = ALIGN(8);
+		*(.dtb*);
+	}
+
+	. = ALIGN(4096);
+	.dynamic : { *(.dynamic) }
+	. = ALIGN(4096);
+
+	.rela : {
+		*(.rela.data*)
+		*(.rela.got)
+		*(.rela.stab)
+                *(.rela__u_boot_list*)
+	}
+
+	. = ALIGN(4096);
+	.dynsym : { *(.dynsym) }
+	. = ALIGN(4096);
+	.dynstr : { *(.dynstr) }
+	. = ALIGN(4096);
+
+        /DISCARD/ : { *(.eh_frame) }
+
+	.ignored.reloc : {
+		*(.rela.reloc)
+		*(.note.GNU-stack)
+	}
+
+	.comment 0 : { *(.comment) }
+}
-- 
2.40.0.634.g4ca3ef3211-goog



More information about the U-Boot mailing list