diff --git a/ChangeLog b/ChangeLog index bf0124c11..ead7b2620 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-11-30 Vladimir Serbinenko + + Ensure that -mno-unaligned-access or some equivalent option is used. + 2013-11-30 Vladimir Serbinenko * grub-core/lib/libgcrypt/mpi/longlong.h: Fix compilation error with diff --git a/acinclude.m4 b/acinclude.m4 index 78212133d..0e867e35c 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -474,23 +474,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] -]) diff --git a/configure.ac b/configure.ac index 1989f87b7..fe6028cfb 100644 --- a/configure.ac +++ b/configure.ac @@ -839,11 +839,26 @@ fi CFLAGS="$TARGET_CFLAGS" -# -mno-unaligned-access +# -mno-unaligned-access -mstrict-align if test "$target_cpu" = arm; then - grub_CHECK_NO_UNALIGNED_ACCESS - if test x"$nua_possible" = xyes; then - TARGET_CFLAGS="$TARGET_CFLAGS -mno-unaligned-access" + AC_CACHE_CHECK([for compile options to get strict alignment], [grub_cv_target_cc_strict_align], [ + grub_cv_target_cc_strict_align=unknown + for arg in -mno-unaligned-access "-Xclang -mstrict-align" -mstrict-align; do + CFLAGS="$TARGET_CFLAGS $arg -Werror" + LDFLAGS="$TARGET_LDFLAGS" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [flag=1], [flag=0]) + if test x"$flag" = x1; then + grub_cv_target_cc_strict_align="$arg" + break; + fi + done]) + + if test x"$grub_cv_target_cc_strict_align" = xunknown; then + AC_MSG_ERROR([couldnt instruct compiler not to use unaligned access]) + fi + TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_strict_align" + if test x"$grub_cv_target_cc_strict_align" = x"-Xclang -mstrict-align"; then + TARGET_LDFLAGS="$TARGET_LDFLAGS -Qunused-arguments" fi fi