ieee1275: split up grub_machine_get_bootlocation
[grub.git] / acinclude.m4
index fd09aad..78cdf6e 100644 (file)
@@ -19,6 +19,8 @@ AC_DEFUN([grub_PROG_TARGET_CC],
 AC_CACHE_VAL(grub_cv_prog_target_cc,
 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
 asm (".globl start; start:");
+void __main (void);
+void __main (void) {}
 int main (void);
 ]], [[]])],
                [grub_cv_prog_target_cc=yes],
@@ -91,7 +93,7 @@ else
 fi
 grub_cv_prog_objcopy_absolute=yes
 for link_addr in 0x2000 0x8000 0x7C00; do
-  if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},$link_addr conftest.o -o conftest.exec]); then :
+  if AC_TRY_COMMAND([${CC-cc} ${TARGET_CFLAGS} ${TARGET_LDFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},$link_addr conftest.o -o conftest.exec]); then :
   else
     AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
   fi
@@ -134,6 +136,29 @@ if test "x$grub_cv_prog_ld_build_id_none" = xyes; then
 fi
 ])
 
+dnl Check nm
+AC_DEFUN([grub_PROG_NM_WORKS],
+[AC_MSG_CHECKING([whether nm works])
+AC_CACHE_VAL(grub_cv_prog_nm_works,
+[
+nm_works_tmp_dir="$(mktemp -d "./confXXXXXX")"
+AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
+$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_works_tmp_dir/ef"
+if $TARGET_NM "$nm_works_tmp_dir/ef" > /dev/null; then
+   grub_cv_prog_nm_works=yes
+else
+   grub_cv_prog_nm_minus_p=no
+fi
+rm "$nm_works_tmp_dir/ef"
+rmdir "$nm_works_tmp_dir"
+])
+AC_MSG_RESULT([$grub_cv_prog_nm_works])
+
+if test "x$grub_cv_prog_nm_works" != xyes; then
+  AC_MSG_ERROR([nm does not work])
+fi
+])
+
 dnl Supply -P to nm
 AC_DEFUN([grub_PROG_NM_MINUS_P],
 [AC_MSG_CHECKING([whether nm accepts -P])
@@ -141,13 +166,14 @@ AC_CACHE_VAL(grub_cv_prog_nm_minus_p,
 [
 nm_minus_p_tmp_dir="$(mktemp -d "./confXXXXXX")"
 AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
-$TARGET_CC conftest.c -o "$nm_minus_p_tmp_dir/ef"
+$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_minus_p_tmp_dir/ef"
 if $TARGET_NM -P "$nm_minus_p_tmp_dir/ef" 2>&1 > /dev/null; then
    grub_cv_prog_nm_minus_p=yes
 else
    grub_cv_prog_nm_minus_p=no
 fi
 rm "$nm_minus_p_tmp_dir/ef"
+rmdir "$nm_minus_p_tmp_dir"
 ])
 AC_MSG_RESULT([$grub_cv_prog_nm_minus_p])
 
@@ -165,13 +191,14 @@ AC_CACHE_VAL(grub_cv_prog_nm_defined_only,
 [
 nm_defined_only_tmp_dir="$(mktemp -d "./confXXXXXX")"
 AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
-$TARGET_CC conftest.c -o "$nm_defined_only_tmp_dir/ef"
+$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_defined_only_tmp_dir/ef"
 if $TARGET_NM --defined-only "$nm_defined_only_tmp_dir/ef" 2>&1 > /dev/null; then
    grub_cv_prog_nm_defined_only=yes
 else
    grub_cv_prog_nm_defined_only=no
 fi
 rm "$nm_defined_only_tmp_dir/ef"
+rmdir "$nm_defined_only_tmp_dir"
 ])
 AC_MSG_RESULT([$grub_cv_prog_nm_defined_only])
 
@@ -183,118 +210,18 @@ fi
 ])
 
 
-dnl Mass confusion!
-dnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit
-dnl instructions, but implicitly insert addr32 and data32 bytes so
-dnl that the code works in real mode''.
-dnl
-dnl Newer versions of GAS interpret `.code16' to mean ``generate 16-bit
-dnl instructions,'' which seems right.  This requires the programmer
-dnl to explicitly insert addr32 and data32 instructions when they want
-dnl them.
-dnl
-dnl We only support the newer versions, because the old versions cause
-dnl major pain, by requiring manual assembly to get 16-bit instructions into
-dnl asm files.
-AC_DEFUN([grub_I386_ASM_ADDR32],
-[AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([grub_I386_ASM_PREFIX_REQUIREMENT])
-AC_MSG_CHECKING([for .code16 addr32 assembler support])
-AC_CACHE_VAL(grub_cv_i386_asm_addr32,
-[cat > conftest.s.in <<\EOF
-       .code16
-l1:    @ADDR32@        movb    %al, l1
-EOF
-
-if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
-  sed -e s/@ADDR32@/addr32/ < conftest.s.in > conftest.s
-else
-  sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
-fi
-
-if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
-  grub_cv_i386_asm_addr32=yes
-else
-  grub_cv_i386_asm_addr32=no
-fi
-
-rm -f conftest*])
-
-AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
-
-dnl check if our compiler is apple cc
-dnl because it requires numerous workarounds
-AC_DEFUN([grub_apple_cc],
-[AC_REQUIRE([AC_PROG_CC])
-AC_MSG_CHECKING([whether our compiler is apple cc])
-AC_CACHE_VAL(grub_cv_apple_cc,
-[if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
-  grub_cv_apple_cc=yes
-else
-  grub_cv_apple_cc=no
-fi
-])
-
-AC_MSG_RESULT([$grub_cv_apple_cc])])
-
-dnl check if our target compiler is apple cc
-dnl because it requires numerous workarounds
-AC_DEFUN([grub_apple_target_cc],
-[AC_REQUIRE([AC_PROG_CC])
-AC_MSG_CHECKING([whether our target compiler is apple cc])
-AC_CACHE_VAL(grub_cv_apple_target_cc,
-[if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
-  grub_cv_apple_target_cc=yes
-else
-  grub_cv_apple_target_cc=no
-fi
-])
-
-AC_MSG_RESULT([$grub_cv_apple_target_cc])])
-
-
-dnl Later versions of GAS requires that addr32 and data32 prefixes
-dnl appear in the same lines as the instructions they modify, while
-dnl earlier versions requires that they appear in separate lines.
-AC_DEFUN([grub_I386_ASM_PREFIX_REQUIREMENT],
-[AC_REQUIRE([AC_PROG_CC])
-AC_MSG_CHECKING(dnl
-[whether addr32 must be in the same line as the instruction])
-AC_CACHE_VAL(grub_cv_i386_asm_prefix_requirement,
-[cat > conftest.s <<\EOF
-       .code16
-l1:    addr32  movb    %al, l1
-EOF
-
-if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
-  grub_cv_i386_asm_prefix_requirement=yes
-else
-  grub_cv_i386_asm_prefix_requirement=no
-fi
-
-rm -f conftest*])
-
-if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
-  grub_tmp_addr32="addr32"
-  grub_tmp_data32="data32"
-else
-  grub_tmp_addr32="addr32;"
-  grub_tmp_data32="data32;"
-fi
-
-ADDR32=$grub_tmp_addr32
-DATA32=$grub_tmp_data32
-
-AC_MSG_RESULT([$grub_cv_i386_asm_prefix_requirement])])
-
-
 dnl Check what symbol is defined as a bss start symbol.
 dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
 AC_DEFUN([grub_CHECK_BSS_START_SYMBOL],
 [AC_REQUIRE([AC_PROG_CC])
 AC_MSG_CHECKING([if __bss_start is defined by the compiler])
 AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
-[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+asm (".globl start; start:");
+void __main (void);
+void __main (void) {}
+int main (void);
+]],
                [[asm ("incl __bss_start")]])],
                [grub_cv_check_uscore_uscore_bss_start_symbol=yes],
                [grub_cv_check_uscore_uscore_bss_start_symbol=no])])
@@ -303,7 +230,11 @@ AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
 
 AC_MSG_CHECKING([if edata is defined by the compiler])
 AC_CACHE_VAL(grub_cv_check_edata_symbol,
-[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+asm (".globl start; start:");
+void __main (void);
+void __main (void) {}
+int main (void);]],
                [[asm ("incl edata")]])],
                [grub_cv_check_edata_symbol=yes],
                [grub_cv_check_edata_symbol=no])])
@@ -312,7 +243,11 @@ AC_MSG_RESULT([$grub_cv_check_edata_symbol])
 
 AC_MSG_CHECKING([if _edata is defined by the compiler])
 AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
-[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+asm (".globl start; start:");
+void __main (void);
+void __main (void) {}
+int main (void);]],
                [[asm ("incl _edata")]])],
                [grub_cv_check_uscore_edata_symbol=yes],
                [grub_cv_check_uscore_edata_symbol=no])])
@@ -336,7 +271,11 @@ AC_DEFUN([grub_CHECK_END_SYMBOL],
 [AC_REQUIRE([AC_PROG_CC])
 AC_MSG_CHECKING([if end is defined by the compiler])
 AC_CACHE_VAL(grub_cv_check_end_symbol,
-[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+asm (".globl start; start:");
+void __main (void);
+void __main (void) {}
+int main (void);]],
                [[asm ("incl end")]])],
                [grub_cv_check_end_symbol=yes],
                [grub_cv_check_end_symbol=no])])
@@ -345,7 +284,11 @@ AC_MSG_RESULT([$grub_cv_check_end_symbol])
 
 AC_MSG_CHECKING([if _end is defined by the compiler])
 AC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
-[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+asm (".globl start; start:");
+void __main (void);
+void __main (void) {}
+int main (void);]],
                [[asm ("incl _end")]])],
                [grub_cv_check_uscore_end_symbol=yes],
                [grub_cv_check_uscore_end_symbol=no])])
@@ -391,7 +334,7 @@ AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
 void foo (void) { volatile char a[8]; a[3]; }
 ]])])
-[if eval "$ac_compile -S -mstack-arg-probe -o conftest.s" 2> /dev/null; then]
+[if eval "$ac_compile -S -mstack-arg-probe -Werror -o conftest.s" 2> /dev/null; then]
   AC_MSG_RESULT([yes])
   [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
   rm -f conftest.s
@@ -401,15 +344,15 @@ else
 [fi]
 ])
 
-dnl Check if ln can handle directories properly (mingw).
+dnl Check if ln -s can handle directories properly (mingw).
 AC_DEFUN([grub_CHECK_LINK_DIR],[
-AC_MSG_CHECKING([whether ln can handle directories properly])
+AC_MSG_CHECKING([whether ln -s can handle directories properly])
 [mkdir testdir 2>/dev/null
 case $srcdir in
 [\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;;
     *) reldir=../$srcdir/include/grub/util ;;
 esac
-if ln -s $reldir testdir/util 2>/dev/null ; then]
+if ln -s $reldir testdir/util 2>/dev/null && rm -f testdir/util 2>/dev/null ; then]
   AC_MSG_RESULT([yes])
   [link_dir=yes
 else
@@ -447,6 +390,58 @@ else
 [fi]
 ])
 
+AC_DEFUN([grub_CHECK_LINK_PIE],[
+[# Position independent executable.
+link_nopie_needed=no]
+AC_MSG_CHECKING([whether linker needs disabling of PIE to work])
+AC_LANG_CONFTEST([AC_LANG_SOURCE([[]])])
+
+[if eval "$ac_compile -Wl,-r,-d -nostdlib -Werror -o conftest.o" 2> /dev/null; then]
+  AC_MSG_RESULT([no])
+  [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
+  rm -f conftest.o
+else
+  link_nopie_needed=yes]
+  AC_MSG_RESULT([yes])
+[fi]
+])
+
+
+dnl Check if the Linker supports `-no-pie'.
+AC_DEFUN([grub_CHECK_NO_PIE],
+[AC_MSG_CHECKING([whether linker accepts -no-pie])
+AC_CACHE_VAL(grub_cv_cc_ld_no_pie,
+[save_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS -no-pie -nostdlib -Werror"
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
+              [grub_cv_cc_ld_no_pie=yes],
+              [grub_cv_cc_ld_no_pie=no])
+LDFLAGS="$save_LDFLAGS"
+])
+AC_MSG_RESULT([$grub_cv_cc_ld_no_pie])
+nopie_possible=no
+if test "x$grub_cv_cc_ld_no_pie" = xyes ; then
+  nopie_possible=yes
+fi
+])
+
+AC_DEFUN([grub_CHECK_NO_PIE_ONEWORD],
+[AC_MSG_CHECKING([whether linker accepts -nopie])
+AC_CACHE_VAL(grub_cv_cc_ld_no_pie_oneword,
+[save_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS -nopie -nostdlib -Werror"
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
+              [grub_cv_cc_ld_no_pie_oneword=yes],
+              [grub_cv_cc_ld_no_pie_oneword=no])
+LDFLAGS="$save_LDFLAGS"
+])
+AC_MSG_RESULT([$grub_cv_cc_ld_no_pie_oneword])
+nopie_oneword_possible=no
+if test "x$grub_cv_cc_ld_no_pie_oneword" = xyes ; then
+  nopie_oneword_possible=yes
+fi
+])
+
 dnl Check if the C compiler supports `-fPIC'.
 AC_DEFUN([grub_CHECK_PIC],[
 [# Position independent executable.
@@ -480,23 +475,3 @@ dnl program.
 AC_DEFUN([grub_TRANSFORM],[dnl
 AC_SUBST(AS_TR_SH([$1]), [`AS_ECHO([$1]) | sed "$program_transform_name"`])dnl
 ])
-
-dnl Check if the C compiler supports `-mno-unaligned-access'.
-AC_DEFUN([grub_CHECK_NO_UNALIGNED_ACCESS],[
-[# foobar
-nua_possible=yes]
-AC_MSG_CHECKING([whether `$CC' supports `-mno-unaligned-access'])
-AC_LANG_CONFTEST([AC_LANG_SOURCE([[
-int main() {
-       return 0;
-}
-]])])
-
-[if eval "$ac_compile -S -mno-unaligned-access -o conftest.s" 2> /dev/null; then]
-  AC_MSG_RESULT([yes])
-  [rm -f conftest.s
-else
-  nua_possible=no]
-  AC_MSG_RESULT([no])
-[fi]
-])