grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Explicitly check for linking format to use for efiemu64 modu


From: Vladimir 'φ-coder/phcoder' Serbinenko
Subject: Re: [PATCH] Explicitly check for linking format to use for efiemu64 module
Date: Mon, 25 Nov 2013 05:22:58 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131005 Icedove/17.0.9

On 24.11.2013 18:21, Andrey Borzenkov wrote:
> 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 <address@hidden>
> ---
> 
> Could you test this patch?
> 
>  configure.ac          | 29 +++++++++++++++++++++++++++--
>  grub-core/Makefile.am |  2 +-
>  2 files changed, 28 insertions(+), 3 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 8619a67..be558de 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 -mx86_64pe -arch,x86_64; do
As in other mail: remove -mx86_64pe
> +      CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
> +      LDFLAGS="-m64 -Wl,$format -nostdlib"
You need -static as otherwise on Apple systems it will try to pull in
the dynamic linker which we don't want (scratch comment about other
thread, I though of adding -static everywhere but it's no necessarry
after all)
> +      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..e6862b7 100644
> --- a/grub-core/Makefile.am
> +++ b/grub-core/Makefile.am
> @@ -421,7 +421,7 @@ efiemu64.o: efiemu64_c.o efiemu64_s.o $(TARGET_OBJ2ELEF)
>         $(TARGET_OBJCONV) -felf64 -nu -nd address@hidden $@ || exit 1; \
>         rm -f address@hidden; \
Here the check for apple linker has to be adjusted as
x$(EFIEMU64_LINK_FORMAT) = x-arch,x86_64
>       else \
> -       $(TARGET_CC) -m64 -Wl,-melf_x86_64 -nostdlib -Wl,-r -o $@ $^ || exit 
> 1; \
> +       $(TARGET_CC) -m64 $(EFIEMU64_LINK_FORMAT) -nostdlib -Wl,-r -o $@ $^ 
> || exit 1; \
>         if test ! -z "$(TARGET_OBJ2ELF)"; then $(TARGET_OBJ2ELF) $@ || (rm -f 
> $@; exit 1); fi; \
Remove TARGET_OBJ2ELF part as it's for 32-bit and we don't use PE here.
>       fi
>  
> 


Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]