65 lines
2.4 KiB
Diff
65 lines
2.4 KiB
Diff
|
|
From 115c628cc44f89207858d0c79e970e43da75c772 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Yingkun Meng <mengyingkun@loongson.cn>
|
||
|
|
Date: Tue, 5 Dec 2023 19:22:14 +0800
|
||
|
|
Subject: [PATCH] loongarch: Disable relaxation relocations
|
||
|
|
|
||
|
|
commit 87247635c0d583cfbc1947107d23b40877d107b8 upstream.
|
||
|
|
|
||
|
|
A working GRUB cannot be built with upcoming binutils and GCC, because linker
|
||
|
|
relaxation was added [1] causing new unsupported relocations to appear in modules.
|
||
|
|
|
||
|
|
So we pass -mno-relax to GCC if it is supported, to disable relaxation and make
|
||
|
|
GRUB forward-compatible with new toolchains.
|
||
|
|
|
||
|
|
While similar code already exists for sparc64 in configure.ac, sparc64 sets
|
||
|
|
LDFLAGS while LoongArch requires CFLAGS to be set. If we only set LDFLAGS on
|
||
|
|
LoongArch, GCC will still generate relaxation relocations in the .o files, so
|
||
|
|
the sparc64 code cannot be reused.
|
||
|
|
|
||
|
|
[1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=56576f4a722b7398d35802ecf7d4185c27d6d69b
|
||
|
|
|
||
|
|
Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
|
||
|
|
Signed-off-by: Yingkun Meng <mengyingkun@loongson.cn>
|
||
|
|
Change-Id: I09ef306dc8a0f8a59e9b7dbc53ae3fd3cc09ec55
|
||
|
|
---
|
||
|
|
configure.ac | 23 +++++++++++++++++++++++
|
||
|
|
1 file changed, 23 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/configure.ac b/configure.ac
|
||
|
|
index 0db9d7d111b8..e010bc0db465 100644
|
||
|
|
--- a/configure.ac
|
||
|
|
+++ b/configure.ac
|
||
|
|
@@ -908,6 +908,29 @@ if test "x$target_cpu" = xloongarch64; then
|
||
|
|
TARGET_CFLAGS="$TARGET_CFLAGS -mno-explicit-relocs -fno-plt"
|
||
|
|
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -mno-explicit-relocs -fno-plt"
|
||
|
|
fi
|
||
|
|
+
|
||
|
|
+ AC_CACHE_CHECK([for no-relax options], grub_cv_target_cc_mno_relax, [
|
||
|
|
+ grub_cv_target_cc_mno_relax=no
|
||
|
|
+ for cand in "-mno-relax" "-Wa,-mno-relax"; do
|
||
|
|
+ if test x"$grub_cv_target_cc_mno_relax" != xno ; then
|
||
|
|
+ break
|
||
|
|
+ fi
|
||
|
|
+ CFLAGS="$TARGET_CFLAGS $cand -Werror"
|
||
|
|
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||
|
|
+ asm (".globl start; start:");
|
||
|
|
+ void __main (void);
|
||
|
|
+ void __main (void) {}
|
||
|
|
+ int main (void);
|
||
|
|
+ ]], [[]])], [grub_cv_target_cc_mno_relax="$cand"], [])
|
||
|
|
+ done
|
||
|
|
+ ])
|
||
|
|
+ CFLAGS="$TARGET_CFLAGS"
|
||
|
|
+
|
||
|
|
+ if test x"$grub_cv_target_cc_mno_relax" != xno ; then
|
||
|
|
+ TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mno_relax"
|
||
|
|
+ TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_mno_relax"
|
||
|
|
+ fi
|
||
|
|
+
|
||
|
|
TARGET_CFLAGS="$TARGET_CFLAGS -Wa,-mla-global-with-abs"
|
||
|
|
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -Wa,-mla-global-with-abs"
|
||
|
|
fi
|
||
|
|
--
|
||
|
|
2.33.0
|
||
|
|
|