$as_echo_n "(cached) " >&6
else
- cat > conftest.S << EOF
+ cat > conftest1.S << EOF
.global _start
.type _start, @function
_start:
/* 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 conftest conftest.S'
+ 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=$?
+ $as_echo "$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=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } \
+ && { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -shared -fPIC -o conftest2.so conftest2.S'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; } \
- && { ac_try='LC_ALL=C $READELF -Wr conftest | grep -q R_LARCH_RELATIVE'
+ && { ac_try='LC_ALL=C $READELF -Wr conftest2.so | grep -q 'R_LARCH_JUMP_SLOT.*external_func''
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
(eval $ac_try) 2>&5
ac_status=$?
then
libc_cv_static_pie_on_loongarch=yes
fi
- rm -rf conftest.*
+ rm -rf conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_static_pie_on_loongarch" >&5
$as_echo "$libc_cv_static_pie_on_loongarch" >&6; }
dnl earlier GCC or Binutils releases as well.
AC_CACHE_CHECK([if the toolchain is sufficient to build static PIE on LoongArch],
libc_cv_static_pie_on_loongarch, [
- cat > conftest.S << EOF
+ cat > conftest1.S << EOF
.global _start
.type _start, @function
_start:
/* 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 conftest conftest.S]) \
- && AC_TRY_COMMAND([LC_ALL=C $READELF -Wr conftest | grep -q R_LARCH_RELATIVE])
+ 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([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -shared -fPIC -o conftest2.so conftest2.S]) \
+ && AC_TRY_COMMAND([LC_ALL=C $READELF -Wr conftest2.so | grep -q 'R_LARCH_JUMP_SLOT.*external_func'])
then
libc_cv_static_pie_on_loongarch=yes
fi
- rm -rf conftest.*])
+ rm -rf conftest* ])
if test "$libc_cv_static_pie_on_loongarch" = yes; then
AC_DEFINE(SUPPORT_STATIC_PIE)
cfi_undefined (1)
or a5, a0, zero /* rtld_fini */
-#if defined(PIC) && !defined(SHARED)
+#if ENABLE_STATIC_PIE
/* For static PIE, the GOT cannot be used in _start because the GOT entries are
- offsets instead of real addresses before __libc_start_main. */
+ offsets instead of real addresses before __libc_start_main.
+ __libc_start_main and/or main may be not local, so we rely on the linker to
+ produce PLT entries for them. GNU ld >= 2.40 supports this. */
# define LA la.pcrel
#else
-/* We must get symbol main through GOT table, since main may not be local.
- For instance: googletest defines main in dynamic library. */
+/* Old GNU ld (< 2.40) cannot handle PC relative address against a non-local
+ function correctly. We deem these old linkers failing to support static PIE
+ and load the addresses from GOT. */
# define LA la.got
#endif