]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Explicitly check for linking format to use for efiemu64 module
authorAndrey Borzenkov <arvidjaar@gmail.com>
Sun, 24 Nov 2013 17:12:17 +0000 (21:12 +0400)
committerAndrey Borzenkov <arvidjaar@gmail.com>
Mon, 25 Nov 2013 18:32:55 +0000 (22:32 +0400)
Similar to check for target linking format, also check for efiemu64
instead of hardcoding -melf_x86_64. This fixes compilation on *BSD
variants. We cannot easily reuse main target check because platforms
are different (main target is 32 bit and efiemu64 - 64 bit).

This commit adds EFIEMU64_LINK_FORMAT that contains detected
link option and is used in efiemu64.o linking instead of hardcoded
value.

Reported-By: Beeblebrox <zaphod@berentweb.com>
configure.ac
grub-core/Makefile.am

index d1292c9c1aa0bc4efeb2ea6d4245f6ddeeb11fee..1989f87b7b4446aef8337ac797514743a96ac786 100644 (file)
@@ -654,6 +654,30 @@ if test x"$efiemu_excuse" = x ; then
      efiemu_excuse="cannot compile with -m64 -mcmodel=large -mno-red-zone -nostdlib"
   fi
 fi
+if test x"$efiemu_excuse" = x ; then
+  AC_CACHE_CHECK([for efiemu64 linking format], [grub_cv_target_cc_efiemu64_link_format], [
+    grub_cv_target_cc_efiemu64_link_format=unknown
+    for format in -melf_x86_64 -melf_x86_64_fbsd -melf_x86_64_obsd -melf_x86_64_haiku -arch,x86_64; do
+      CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
+      LDFLAGS="-m64 -Wl,$format -nostdlib -static"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+      asm (".globl start; start:");
+      asm (".globl _start; _start:");
+      asm (".globl __start; __start:");
+      void __main (void);
+      void __main (void) {}
+      ]], [[]])], [flag=1], [flag=0])
+      if test x"$flag" = x1; then
+        grub_cv_target_cc_efiemu64_link_format="$format"
+       break;
+      fi
+    done])
+  if test x"$grub_cv_target_cc_efiemu64_link_format" = xunknown; then
+    efiemu_excuse="no suitable link format for efiemu64 found"
+  else
+    EFIEMU64_LINK_FORMAT="-Wl,$grub_cv_target_cc_efiemu64_link_format"
+  fi
+fi
 if test x"$enable_efiemu" = xyes && test x"$efiemu_excuse" != x ; then
   AC_MSG_ERROR([efiemu runtime was explicitly requested but can't be compiled])
 fi
@@ -663,11 +687,12 @@ else
 enable_efiemu=no
 fi
 AC_SUBST([enable_efiemu])
+AC_SUBST([EFIEMU64_LINK_FORMAT])
 
 CFLAGS="$TARGET_CFLAGS"
 
 if test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
-  AC_CACHE_CHECK([for linking format], [grub_cv_target_cc_link_format], [
+  AC_CACHE_CHECK([for target linking format], [grub_cv_target_cc_link_format], [
     grub_cv_target_cc_link_format=unknown
     for format in -melf_${target_cpu} -melf_${target_cpu}_fbsd -melf_${target_cpu}_obsd -melf_${target_cpu}_haiku -m${target_cpu}pe -arch,${target_cpu}; do
       if test x${target_cpu} != xi386 && test x$format = x${target_cpu}pe; then
@@ -681,7 +706,7 @@ if test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
       asm (".globl __start; __start:");
       void __main (void);
       void __main (void) {}
-      ]], [[]])], [flag=1], [])
+      ]], [[]])], [flag=1], [flag=0])
       if test x"$flag" = x1; then
         grub_cv_target_cc_link_format="$format"
        break;
index e2da083f2579bef3cf74f8fc5be48415a349f8bd..c096098d132dde4f409945f8be863bd0534e54d4 100644 (file)
@@ -398,8 +398,9 @@ efiemu32.o: efiemu/runtime/efiemu.c $(TARGET_OBJ2ELF)
          if test ! -z "$(TARGET_OBJ2ELF)"; then $(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi; \
        fi
 
+# Link format -arch,x86_64 means Apple linker
 efiemu64_c.o: efiemu/runtime/efiemu.c
-       if test "x$(TARGET_APPLE_LINKER)" = x1; then \
+       if test "x$(EFIEMU64_LINK_FORMAT)" = x-arch,x86_64; then \
          $(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -nostdlib -Wall -Werror -mno-red-zone -c -o $@ $< || exit 1; \
        else \
          $(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -nostdlib -Wall -Werror -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
@@ -407,7 +408,7 @@ efiemu64_c.o: efiemu/runtime/efiemu.c
 
 efiemu64_s.o: efiemu/runtime/efiemu.S
        -rm -f $@
-       if test "x$(TARGET_APPLE_LINKER)" = x1; then \
+       if test "x$(EFIEMU64_LINK_FORMAT)" = x-arch,x86_64; then \
          $(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -Wall -Werror -nostdlib -O2 -mno-red-zone -c -o $@ $< || exit 1; \
        else \
          $(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -Wall -Werror -nostdlib -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
@@ -415,14 +416,13 @@ efiemu64_s.o: efiemu/runtime/efiemu.S
 
 efiemu64.o: efiemu64_c.o efiemu64_s.o $(TARGET_OBJ2ELEF)
        -rm -f $@; \
-       if test "x$(TARGET_APPLE_LINKER)" = x1; then \
+       if test "x$(EFIEMU64_LINK_FORMAT)" = x-arch,x86_64; then \
          rm -f $@.bin; \
          $(TARGET_CC) -m64 -Wl,-r -nostdlib -o $@.bin $^ || exit 1; \
          $(TARGET_OBJCONV) -felf64 -nu -nd $@.bin $@ || exit 1; \
          rm -f $@.bin; \
        else \
-         $(TARGET_CC) -m64 -Wl,-melf_x86_64 -nostdlib -Wl,-r -o $@ $^ || exit 1; \
-         if test ! -z "$(TARGET_OBJ2ELF)"; then $(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi; \
+         $(TARGET_CC) -m64 $(EFIEMU64_LINK_FORMAT) -nostdlib -Wl,-r -o $@ $^ || exit 1; \
        fi
 
 platform_DATA += efiemu32.o efiemu64.o