From: Christian Storm <christian.st...@siemens.com>

With gnu-efi >= 3.0.16, the binary format assemblage
doesn't work anymore due to lds and crt0 changes.

Hence, with gnu-efi >= 3.0.16, use the efi-app target.
For gnu-efi == 3.0.15, still use the binary assemblage.

Signed-off-by: Christian Storm <christian.st...@siemens.com>
---
Rewrite to esape if-then-else hell.

 Makefile.am  | 15 ++++++++++-----
 configure.ac | 14 ++++++++++++++
 2 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 47dfbe5..e19d0c3 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
+# Suppress RWX segment warnings.
+efi_ldflags += $(LDFLAGS_NO_WARN_RWX_SEGMENTS)
+endif
+
 if ARCH_IS_X86
 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.
+if OBJCOPY_USE_EFI_APP_TARGET
+objcopy_format = --target=efi-app-$(ARCH)
+else
 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
 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..e533fe4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -39,6 +39,8 @@ AC_SYS_LARGEFILE
 AC_PROG_CC
 AC_CHECK_TOOL(LD, ld)
 AC_CHECK_TOOL(OBJCOPY, objcopy)
+AC_CHECK_TOOL(GREP, grep)
+AC_CHECK_TOOL(TR, tr)
 
 dnl Dont try to use things like -std=c99 for efi compilation
 GNUEFI_CC=$CC
@@ -221,6 +223,18 @@ if test "x$PKG_CONFIG" = "xno"; then
        AC_MSG_ERROR([You need to install pkg-config])
 fi
 
+# Note: gnu-efi introduced pkg-config with version 3.0.16
+# GNU_EFI_VERSION resolves to gnu-efi's version without dots, e.g., 
GNU_EFI_VERSION=3016
+# gnu-efi versions < 3.0.16 resolve to GNU_EFI_VERSION=0
+AC_SUBST([GNU_EFI_VERSION], [$(($PKG_CONFIG --modversion "gnu-efi" 2>/dev/null 
|| echo 0) | $TR -d '.' )])
+
+AC_SUBST([OBJCOPY_HAS_EFI_APP_TARGET], [$($OBJCOPY --info | $GREP -q pei- 
2>/dev/null && echo "true")])
+if test -z $OBJCOPY_HAS_EFI_APP_TARGET && test $GNU_EFI_VERSION -gt 0; then
+       AC_MSG_ERROR([objcopy doesn't support --target=efi-app but gnu-efi >= 
3.0.16])
+fi
+AM_CONDITIONAL([OBJCOPY_USE_EFI_APP_TARGET],
+              [test -n $OBJCOPY_HAS_EFI_APP_TARGET && test $GNU_EFI_VERSION 
-gt 0])
+
 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 efibootguard-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/efibootguard-dev/C6C1363D-EFB1-413E-9993-94BF99DED746%40siemens.com.

Reply via email to