From: Christian Storm <[email protected]>
With gnu-efi >= 3.0.16, the binary format assemblage for
arm doesn't work anymore due to lds and crt0 changes.
Hence, with gnu-efi >= 3.0.16 and binutils >= 2.38, use the
efi-app-${ARCH} target. For gnu-efi == 3.0.15, use the binary
assemblage, not needing binutils efi-app target support.
Signed-off-by: Christian Storm <[email protected]>
---
Makefile.am | 17 +++++++++++------
configure.ac | 18 ++++++++++++++++++
2 files changed, 29 insertions(+), 6 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 47dfbe5..2e802c3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -242,15 +242,20 @@ efi_ldflags = \
-L $(GNUEFI_LIB_DIR) \
$(GNUEFI_LIB_DIR)/crt0-efi-$(ARCH).o
-if ARCH_IS_X86
+if !ARCH_IS_X86
+# Suppress RWX segment warnings.
+efi_ldflags += $(LDFLAGS_NO_WARN_RWX_SEGMENTS)
+endif
+
+if ARCH_IS_ARM
+if AARCH64_EFI_APP
objcopy_format = --target=efi-app-$(ARCH)
else
-# aarch64's and arm's objcopy don't understand --target efi-[app|bsdrv|rtdrv],
-# hence set subsystem 0xa (EFI application) and binary format.
objcopy_format = -O binary
efi_ldflags += --defsym=EFI_SUBSYSTEM=0xa
-# Also suppress RWX segment warnings until we have a better solution
-efi_ldflags += $(LDFLAGS_NO_WARN_RWX_SEGMENTS)
+endif
+else
+objcopy_format = --target=efi-app-$(ARCH)
endif
efi_objects_pre1 = $(efi_sources:.c=.o)
@@ -300,7 +305,7 @@ $(efi_solib): $(efi_objects)
$(efi_loadername): $(efi_solib)
$(AM_V_GEN) $(OBJCOPY) -j .text -j .wdfuncs -j .sdata -j .data -j
.dynamic \
- -j .dynsym -j .rel* $(objcopy_format) $< $@
+ -j .dynsym -j .rodata -j .rel* $(objcopy_format) $< $@
$(kernel_stub_solib): $(kernel_stub_objects)
$(AM_V_CCLD)$(LD) $(efi_ldflags) $(kernel_stub_objects) \
diff --git a/configure.ac b/configure.ac
index eadccd6..2e691c0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -39,6 +39,7 @@ AC_SYS_LARGEFILE
AC_PROG_CC
AC_CHECK_TOOL(LD, ld)
AC_CHECK_TOOL(OBJCOPY, objcopy)
+AC_CHECK_TOOL(GREP, grep)
dnl Dont try to use things like -std=c99 for efi compilation
GNUEFI_CC=$CC
@@ -110,6 +111,7 @@ AM_COND_IF(ARCH_RISCV64, [
AC_SUBST([ARCH])
AC_SUBST([MACHINE_TYPE_NAME])
AM_CONDITIONAL([ARCH_IS_X86], [test "$ARCH" = "ia32" -o "$ARCH" = "x86_64"])
+AM_CONDITIONAL([ARCH_IS_ARM], [test "$ARCH" = "arm" -o "$ARCH" = "aarch64"])
# -mgeneral-regs-only was introduced with gcc-9 to ARM, and RISCV64 does not
support it until now
AX_CHECK_COMPILE_FLAG([-mgeneral-regs-only],
@@ -221,6 +223,22 @@ if test "x$PKG_CONFIG" = "xno"; then
AC_MSG_ERROR([You need to install pkg-config])
fi
+# gnu-efi introduced pkg-config with version 3.0.16
+# Note: If found, GNUEFI_CFLAGS and GNUEFI_LIBS are
+# set which may eventually be used to supersede the
+# above manual gnu-efi configuration.
+PKG_CHECK_MODULES(GNUEFI, [gnu-efi >= 3.0.16],
+ [gnu_efi_has_pkgconfig="yes"],
+ [gnu_efi_has_pkgconfig="no"])
+
+# Note: As of gnu-efi 3.0.16 basing on binutils >= 2.38
+# supporting the efi-app-aarch64 target, the objcopy
+# binary format assemblage doesn't work anymore due to
+# lds and crt0 changes. However, not so with gnu-efi
+# 3.0.15 shipped by Debian, hence this conditional.
+AM_CONDITIONAL([AARCH64_EFI_APP],
+ [$OBJCOPY --info | $GREP -q pei- && test
"x$gnu_efi_has_pkgconfig" = "xyes"])
+
AS_IF([test "x$enable_bootloader" != "xno"],
[
PKG_CHECK_MODULES(LIBPCI, libpci)
--
2.44.0
--
You received this message because you are subscribed to the Google Groups "EFI
Boot Guard" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/efibootguard-dev/BEF15434-2424-4876-9103-AF34030E97DC%40siemens.com.