From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1Vl0fi-0004Zz-1q for mharc-grub-devel@gnu.org; Mon, 25 Nov 2013 13:14:10 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36639) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vl0fb-0004T0-Gw for grub-devel@gnu.org; Mon, 25 Nov 2013 13:14:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Vl0fW-00022z-Ne for grub-devel@gnu.org; Mon, 25 Nov 2013 13:14:03 -0500 Received: from mail-lb0-x234.google.com ([2a00:1450:4010:c04::234]:57973) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vl0fW-00022g-BQ for grub-devel@gnu.org; Mon, 25 Nov 2013 13:13:58 -0500 Received: by mail-lb0-f180.google.com with SMTP id w6so3552648lbh.11 for ; Mon, 25 Nov 2013 10:13:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HbxeH1JFIrHDj91oEtlhg6nN8vHcbMVPuP0HsHiy5Ow=; b=DxCV6fy0hisr4hV40W7vSK50XlL2rND6Rgrp5KSH9EDlVtVe732zaZ26ylDCzxSsBH qIoYAm/eEcyojrjxGAi8PGWQmfy7h6z7t5yyDwsXcAA7QKFx1Fvs0BLsH6Ep416Dnq3P zvn7DxLNzfNT6EJuWCbdXbP2oi1SdniTG0Nv2tlneT1+A7/nVUpWC/OXJchTzNrCGoh0 ARle8QB/AMnaFntdYQw+xjOs1hPJVr9nejk9ghIn/iKg8taYEfudpW4SxSDpJVExulvx kkSLoxFkzZ2Kip+6YPQI5WZf/ZoOQTyiGL5OLkMsOdCNP5eQFrWzBssvfv9DrCB+eytG G89w== X-Received: by 10.112.210.197 with SMTP id mw5mr1917059lbc.42.1385403237201; Mon, 25 Nov 2013 10:13:57 -0800 (PST) Received: from localhost.localdomain (ppp91-76-170-113.pppoe.mtu-net.ru. [91.76.170.113]) by mx.google.com with ESMTPSA id bo10sm6958877lbb.16.2013.11.25.10.13.56 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Nov 2013 10:13:56 -0800 (PST) From: Andrey Borzenkov To: grub-devel@gnu.org Subject: [PATCH v2] Explicitly check for linking format to use for efiemu64 module Date: Mon, 25 Nov 2013 22:13:42 +0400 Message-Id: <1385403222-20943-1-git-send-email-arvidjaar@gmail.com> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <52938E36.40405@gmail.com> References: <52938E36.40405@gmail.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:4010:c04::234 Cc: Beeblebrox X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Nov 2013 18:14:08 -0000 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 --- configure.ac | 29 +++++++++++++++++++++++++++-- grub-core/Makefile.am | 9 ++++----- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index d1292c9..1989f87 100644 --- a/configure.ac +++ b/configure.ac @@ -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; diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am index e2da083..3ca52ea 100644 --- a/grub-core/Makefile.am +++ b/grub-core/Makefile.am @@ -399,7 +399,7 @@ efiemu32.o: efiemu/runtime/efiemu.c $(TARGET_OBJ2ELF) fi 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 +407,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 +415,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 -- 1.8.1.4