diff options
Diffstat (limited to 'sysdeps/loongarch')
-rw-r--r-- | sysdeps/loongarch/configure | 36 | ||||
-rw-r--r-- | sysdeps/loongarch/configure.ac | 30 |
2 files changed, 16 insertions, 50 deletions
diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure index 395ddc92ca..30b60d1983 100644 --- a/sysdeps/loongarch/configure +++ b/sysdeps/loongarch/configure @@ -4,21 +4,19 @@ printf "%s\n" "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the toolchain is sufficient to build static PIE on LoongArch" >&5 -printf %s "checking if the toolchain is sufficient to build static PIE on LoongArch... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if ${CC-cc} is sufficient to build static PIE on LoongArch" >&5 +printf %s "checking if ${CC-cc} is sufficient to build static PIE on LoongArch... " >&6; } if test ${libc_cv_static_pie_on_loongarch+y} then : printf %s "(cached) " >&6 else $as_nop - cat > conftest1.S <<\EOF + cat > conftest.S <<\EOF .global _start .type _start, @function _start: li.w $a7, 93 - /* This ensures the assembler supports explicit reloc. */ - pcalau12i $a0, %pc_hi20(x) - ld.w $a0, $a0, %pc_lo12(x) + li.w $a0, 0 syscall 0 .data @@ -27,41 +25,21 @@ x: /* This should produce an R_LARCH_RELATIVE in the static PIE. */ .dword _start EOF - cat > conftest2.S <<\EOF -.global f -.type f, @function -f: - /* The linker should be able to handle this and produce a PLT entry. */ - la.pcrel $t0, $t0, external_func - jirl $zero, $t0, 0 -EOF libc_cv_static_pie_on_loongarch=no - if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostdlib -fPIE -o conftest1 conftest1.S' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 - (eval $ac_try) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; } \ - && { ac_try='LC_ALL=C $READELF -Wr conftest1 | grep -q R_LARCH_RELATIVE' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 - (eval $ac_try) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; } \ - && ! { ac_try='LC_ALL=C $READELF -Wl conftest1 | grep -q INTERP' + if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostdlib -fPIE -o conftest conftest.S' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } \ - && { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -shared -nostdlib -fPIC -o conftest2.so conftest2.S' + && { ac_try='LC_ALL=C $READELF -Wr conftest | grep -q R_LARCH_RELATIVE' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } \ - && { ac_try='LC_ALL=C $READELF -Wr conftest2.so | grep -q 'R_LARCH_JUMP_SLOT.*external_func'' + && ! { ac_try='LC_ALL=C $READELF -Wl conftest | grep -q INTERP' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac index 989287c6d2..28a8ae5486 100644 --- a/sysdeps/loongarch/configure.ac +++ b/sysdeps/loongarch/configure.ac @@ -8,19 +8,17 @@ AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC) dnl Test if the toolchain is new enough for static PIE. dnl We need a GAS supporting explicit reloc (older GAS produces stack-based dnl reloc and triggers an internal error in the linker). And, we need GCC to -dnl pass the correct linker flags for static PIE. GCC >= 13 and GAS >= 2.40 -dnl satisfy the requirement, but a distro may backport static PIE support into -dnl earlier GCC or Binutils releases as well. -AC_CACHE_CHECK([if the toolchain is sufficient to build static PIE on LoongArch], +dnl pass the correct linker flags for static PIE. We strictly require GAS >= +dnl 2.41 so we don't need to check the assembler capability, but we need to +dnl check if GCC is doing the correct thing. +AC_CACHE_CHECK([if ${CC-cc} is sufficient to build static PIE on LoongArch], libc_cv_static_pie_on_loongarch, [ - cat > conftest1.S <<\EOF + cat > conftest.S <<\EOF .global _start .type _start, @function _start: li.w $a7, 93 - /* This ensures the assembler supports explicit reloc. */ - pcalau12i $a0, %pc_hi20(x) - ld.w $a0, $a0, %pc_lo12(x) + li.w $a0, 0 syscall 0 .data @@ -29,21 +27,11 @@ x: /* This should produce an R_LARCH_RELATIVE in the static PIE. */ .dword _start EOF - cat > conftest2.S <<\EOF -.global f -.type f, @function -f: - /* The linker should be able to handle this and produce a PLT entry. */ - la.pcrel $t0, $t0, external_func - jirl $zero, $t0, 0 -EOF libc_cv_static_pie_on_loongarch=no - if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostdlib -fPIE -o conftest1 conftest1.S]) \ - && AC_TRY_COMMAND([LC_ALL=C $READELF -Wr conftest1 | grep -q R_LARCH_RELATIVE]) \ - && ! AC_TRY_COMMAND([LC_ALL=C $READELF -Wl conftest1 | grep -q INTERP]) \ - && AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -shared -nostdlib -fPIC -o conftest2.so conftest2.S]) \ - && AC_TRY_COMMAND([LC_ALL=C $READELF -Wr conftest2.so | grep -q 'R_LARCH_JUMP_SLOT.*external_func']) + if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostdlib -fPIE -o conftest conftest.S]) \ + && AC_TRY_COMMAND([LC_ALL=C $READELF -Wr conftest | grep -q R_LARCH_RELATIVE]) \ + && ! AC_TRY_COMMAND([LC_ALL=C $READELF -Wl conftest | grep -q INTERP]) then libc_cv_static_pie_on_loongarch=yes fi |