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],
fi
if $EGREP '(^|[^_[:alnum]])_func' conftest.s >/dev/null 2>&1; then
+ HAVE_ASM_USCORE=1
grub_cv_asm_uscore=yes
else
+ HAVE_ASM_USCORE=0
grub_cv_asm_uscore=no
fi
rm -f conftest*])
-if test "x$grub_cv_asm_uscore" = xyes; then
- AC_DEFINE_UNQUOTED([HAVE_ASM_USCORE], $grub_cv_asm_uscore,
- [Define if C symbols get an underscore after compilation])
-fi
-
AC_MSG_RESULT([$grub_cv_asm_uscore])
])
dnl Some versions of `objcopy -O binary' vary their output depending
dnl on the link address.
AC_DEFUN([grub_PROG_OBJCOPY_ABSOLUTE],
-[AC_MSG_CHECKING([whether ${OBJCOPY} works for absolute addresses])
+[AC_MSG_CHECKING([whether ${TARGET_OBJCOPY} works for absolute addresses])
AC_CACHE_VAL(grub_cv_prog_objcopy_absolute,
[cat > conftest.c <<\EOF
void cmain (void);
else
AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
fi
- if AC_TRY_COMMAND([${OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest]); then :
+ if AC_TRY_COMMAND([${TARGET_OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest]); then :
else
- AC_MSG_ERROR([${OBJCOPY-objcopy} cannot create binary files])
+ AC_MSG_ERROR([${TARGET_OBJCOPY-objcopy} cannot create binary files])
fi
if test ! -f conftest.old || AC_TRY_COMMAND([cmp -s conftest.old conftest]); then
mv -f conftest conftest.old
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])
+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 $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])
+
+if test "x$grub_cv_prog_nm_minus_p" = xyes; then
+ TARGET_NMFLAGS_MINUS_P="-P"
+else
+ TARGET_NMFLAGS_MINUS_P=
+fi
+])
+
+dnl Supply --defined-only to nm
+AC_DEFUN([grub_PROG_NM_DEFINED_ONLY],
+[AC_MSG_CHECKING([whether nm accepts --defined-only])
+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 $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])
+
+if test "x$grub_cv_prog_nm_defined_only" = xyes; then
+ TARGET_NMFLAGS_DEFINED_ONLY=--defined-only
+else
+ TARGET_NMFLAGS_DEFINED_ONLY=
+fi
+])
+
dnl Mass confusion!
dnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit
sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
fi
-if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
+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
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.
l1: addr32 movb %al, l1
EOF
-if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
+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
grub_tmp_data32="data32;"
fi
-AC_DEFINE_UNQUOTED([ADDR32], $grub_tmp_addr32,
- [Define it to \"addr32\" or \"addr32;\" to make GAS happy])
-AC_DEFINE_UNQUOTED([DATA32], $grub_tmp_data32,
- [Define it to \"data32\" or \"data32;\" to make GAS happy])
+ADDR32=$grub_tmp_addr32
+DATA32=$grub_tmp_data32
AC_MSG_RESULT([$grub_cv_i386_asm_prefix_requirement])])
-dnl Older versions of GAS require that absolute indirect calls/jumps are
-dnl not prefixed with `*', while later versions warn if not prefixed.
-AC_DEFUN([grub_I386_ASM_ABSOLUTE_WITHOUT_ASTERISK],
-[AC_REQUIRE([AC_PROG_CC])
-AC_MSG_CHECKING(dnl
-[whether an absolute indirect call/jump must not be prefixed with an asterisk])
-AC_CACHE_VAL(grub_cv_i386_asm_absolute_without_asterisk,
-[cat > conftest.s <<\EOF
- lcall *(offset)
-offset:
- .long 0
- .word 0
-EOF
-
-if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
- grub_cv_i386_asm_absolute_without_asterisk=no
-else
- grub_cv_i386_asm_absolute_without_asterisk=yes
-fi
-
-rm -f conftest*])
-
-if test "x$grub_cv_i386_asm_absolute_without_asterisk" = xyes; then
- AC_DEFINE([ABSOLUTE_WITHOUT_ASTERISK], 1,
- [Define it if GAS requires that absolute indirect calls/jumps are not prefixed with an asterisk])
-fi
-
-AC_MSG_RESULT([$grub_cv_i386_asm_absolute_without_asterisk])])
-
-
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])])
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])])
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])])
AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol])
-AH_TEMPLATE([BSS_START_SYMBOL], [Define it to one of __bss_start, edata and _edata])
-
if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then
- AC_DEFINE([BSS_START_SYMBOL], [__bss_start])
+ BSS_START_SYMBOL=__bss_start
elif test "x$grub_cv_check_edata_symbol" = xyes; then
- AC_DEFINE([BSS_START_SYMBOL], [edata])
+ BSS_START_SYMBOL=edata
elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then
- AC_DEFINE([BSS_START_SYMBOL], [_edata])
+ BSS_START_SYMBOL=_edata
else
AC_MSG_ERROR([none of __bss_start, edata or _edata is defined])
fi
[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])])
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])])
AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol])
-AH_TEMPLATE([END_SYMBOL], [Define it to either end or _end])
-
if test "x$grub_cv_check_end_symbol" = xyes; then
- AC_DEFINE([END_SYMBOL], [end])
+ END_SYMBOL=end
elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then
- AC_DEFINE([END_SYMBOL], [_end])
+ END_SYMBOL=_end
else
AC_MSG_ERROR([neither end nor _end is defined])
fi
])
-dnl Check if the C compiler generates calls to `__enable_execute_stack()'.
-AC_DEFUN([grub_CHECK_ENABLE_EXECUTE_STACK],[
-AC_MSG_CHECKING([whether `$CC' generates calls to `__enable_execute_stack()'])
-AC_LANG_CONFTEST([[
-void f (int (*p) (void));
-void g (int i)
-{
- int nestedfunc (void) { return i; }
- f (nestedfunc);
-}
-]])
-if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then
- true
-else
- AC_MSG_ERROR([${CC-cc} failed to produce assembly code])
-fi
-if grep __enable_execute_stack conftest.s >/dev/null 2>&1; then
- AC_DEFINE([NEED_ENABLE_EXECUTE_STACK], 1,
- [Define to 1 if GCC generates calls to __enable_execute_stack()])
- AC_MSG_RESULT([yes])
-else
- AC_MSG_RESULT([no])
-fi
-rm -f conftest*
-])
-
\f
dnl Check if the C compiler supports `-fstack-protector'.
AC_DEFUN([grub_CHECK_STACK_PROTECTOR],[
ssp_possible=yes]
AC_MSG_CHECKING([whether `$CC' accepts `-fstack-protector'])
# Is this a reliable test case?
-AC_LANG_CONFTEST([[void foo (void) { volatile char a[8]; a[3]; }]])
+AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+void foo (void) { volatile char a[8]; a[3]; }
+]])])
[# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
# `ac_compile' like this correct, after all?
if eval "$ac_compile -S -fstack-protector -o conftest.s" 2> /dev/null; then]
[# Smashing stack arg probe.
sap_possible=yes]
AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
-AC_LANG_CONFTEST([[void foo (void) { volatile char a[8]; a[3]; }]])
-[if eval "$ac_compile -S -mstack-arg-probe -o conftest.s" 2> /dev/null; then]
+AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+void foo (void) { volatile char a[8]; a[3]; }
+]])])
+[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
pie_possible=yes]
AC_MSG_CHECKING([whether `$CC' has `-fPIE' as default])
# Is this a reliable test case?
-AC_LANG_CONFTEST([[
+AC_LANG_CONFTEST([AC_LANG_SOURCE([[
#ifdef __PIE__
int main() {
return 0;
#else
#error NO __PIE__ DEFINED
#endif
-]])
+]])])
[# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
# `ac_compile' like this correct, after all?
AC_MSG_RESULT([no])
[fi]
])
+
+dnl Check if the C compiler supports `-fPIC'.
+AC_DEFUN([grub_CHECK_PIC],[
+[# Position independent executable.
+pic_possible=yes]
+AC_MSG_CHECKING([whether `$CC' has `-fPIC' as default])
+# Is this a reliable test case?
+AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+#ifdef __PIC__
+int main() {
+ return 0;
+}
+#else
+#error NO __PIC__ DEFINED
+#endif
+]])])
+
+[# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
+# `ac_compile' like this correct, after all?
+if eval "$ac_compile -S -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
+else
+ pic_possible=no]
+ AC_MSG_RESULT([no])
+[fi]
+])
+
+dnl Create an output variable with the transformed name of a GRUB utility
+dnl program.
+AC_DEFUN([grub_TRANSFORM],[dnl
+AC_SUBST(AS_TR_SH([$1]), [`AS_ECHO([$1]) | sed "$program_transform_name"`])dnl
+])