* [PATCH 0/1] LoongArch: Add static PIE support
@ 2022-09-22 9:19 Xi Ruoyao
2022-09-22 9:19 ` [PATCH 1/1] " Xi Ruoyao
0 siblings, 1 reply; 3+ messages in thread
From: Xi Ruoyao @ 2022-09-22 9:19 UTC (permalink / raw)
To: libc-alpha
Cc: caiyinyu, liuzhensong, Lulu Cheng, Wang Xuerui, Chenghua Xu, Xi Ruoyao
Static PIE allows us to extend the ASLR to cover static executables,
this patch adds static PIE support for LoongArch.
Change from RFC to v1: no change, just remove "RFC" because the GCC [1]
and Binutils [2][3] patches are already merged.
[1]: https://gcc.gnu.org/r13-2728
[2]: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=ae2e4d4
Summary of test results (with GCC trunk and Binutils trunk):
4592 PASS
22 UNSUPPORTED
12 XFAIL
6 XPASS
Use "sln" as an example to show it works:
$ file elf/sln
elf/sln: ELF 64-bit LSB pie executable, LoongArch, version 1 (SYSV),
static-pie linked, for GNU/Linux 5.19.0, with debug_info, not stripped
$ touch a
$ elf/sln a b
$ readlink b
a
Xi Ruoyao (1):
LoongArch: Add static PIE support
sysdeps/loongarch/configure | 37 ++++++++++++++++++++++++++++++++++
sysdeps/loongarch/configure.ac | 14 +++++++++++++
sysdeps/loongarch/start.S | 14 ++++++++++---
3 files changed, 62 insertions(+), 3 deletions(-)
--
2.37.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/1] LoongArch: Add static PIE support
2022-09-22 9:19 [PATCH 0/1] LoongArch: Add static PIE support Xi Ruoyao
@ 2022-09-22 9:19 ` Xi Ruoyao
2022-09-22 18:32 ` Adhemerval Zanella Netto
0 siblings, 1 reply; 3+ messages in thread
From: Xi Ruoyao @ 2022-09-22 9:19 UTC (permalink / raw)
To: libc-alpha
Cc: caiyinyu, liuzhensong, Lulu Cheng, Wang Xuerui, Chenghua Xu, Xi Ruoyao
If the compiler is new enough, enable static PIE support. In the static
PIE version of _start (in rcrt1.o), use la.pcrel instead of la.got
because in a static PIE we cannot use GOT entries until the dynamic
relocations for GOT are resolved.
---
sysdeps/loongarch/configure | 37 ++++++++++++++++++++++++++++++++++
sysdeps/loongarch/configure.ac | 14 +++++++++++++
sysdeps/loongarch/start.S | 14 ++++++++++---
3 files changed, 62 insertions(+), 3 deletions(-)
diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure
index 43b54d4965..7e671241a8 100644
--- a/sysdeps/loongarch/configure
+++ b/sysdeps/loongarch/configure
@@ -3,3 +3,40 @@
$as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC is sufficient to build static PIE on LoongArch" >&5
+$as_echo_n "checking if $CC is sufficient to build static PIE on LoongArch... " >&6; }
+if ${libc_cv_static_pie_on_loongarch+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+#if !defined __GNUC__ || __GNUC__ < 13
+#error insufficient compiler for static PIE on LoongArch
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ libc_cv_static_pie_on_loongarch=yes
+else
+ libc_cv_static_pie_on_loongarch=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+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; }
+if test "$libc_cv_static_pie_on_loongarch" = yes; then
+ $as_echo "#define SUPPORT_STATIC_PIE 1" >>confdefs.h
+
+fi
diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac
index f744367bf3..624897bfb3 100644
--- a/sysdeps/loongarch/configure.ac
+++ b/sysdeps/loongarch/configure.ac
@@ -4,3 +4,17 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
dnl It is always possible to access static and hidden symbols in an
dnl position independent way.
AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC)
+
+dnl test if GCC is new enough for static PIE.
+AC_CACHE_CHECK([if $CC is sufficient to build static PIE on LoongArch],
+libc_cv_static_pie_on_loongarch, [
+AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[]], [[
+#if !defined __GNUC__ || __GNUC__ < 13
+#error insufficient compiler for static PIE on LoongArch
+#endif
+]])],
+ [libc_cv_static_pie_on_loongarch=yes],
+ [libc_cv_static_pie_on_loongarch=no])])
+if test "$libc_cv_static_pie_on_loongarch" = yes; then
+ AC_DEFINE(SUPPORT_STATIC_PIE)
+fi
diff --git a/sysdeps/loongarch/start.S b/sysdeps/loongarch/start.S
index e66af16d57..05cabd9b96 100644
--- a/sysdeps/loongarch/start.S
+++ b/sysdeps/loongarch/start.S
@@ -60,9 +60,17 @@ ENTRY (ENTRY_POINT)
cfi_undefined (1)
or a5, a0, zero /* rtld_fini */
+#if defined(PIC) && !defined(SHARED)
+/* For static PIE, the GOT cannot be used in _start because the GOT entries are
+ offsets instead of real addresses before __libc_start_main. */
+# 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. */
- la.got a0, t0, main
+# define LA la.got
+#endif
+
+ LA a0, t0, main
REG_L a1, sp, 0
ADDI a2, sp, SZREG
@@ -73,9 +81,9 @@ ENTRY (ENTRY_POINT)
move a4, zero /* used to be fini */
or a6, sp, zero /* stack_end */
- la.got ra, t0, __libc_start_main
+ LA ra, t0, __libc_start_main
jirl ra, ra, 0
- la.got ra, t0, abort
+ LA ra, t0, abort
jirl ra, ra, 0
END (ENTRY_POINT)
--
2.37.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 1/1] LoongArch: Add static PIE support
2022-09-22 9:19 ` [PATCH 1/1] " Xi Ruoyao
@ 2022-09-22 18:32 ` Adhemerval Zanella Netto
0 siblings, 0 replies; 3+ messages in thread
From: Adhemerval Zanella Netto @ 2022-09-22 18:32 UTC (permalink / raw)
To: libc-alpha
On 22/09/22 06:19, Xi Ruoyao via Libc-alpha wrote:
> If the compiler is new enough, enable static PIE support. In the static
> PIE version of _start (in rcrt1.o), use la.pcrel instead of la.got
> because in a static PIE we cannot use GOT entries until the dynamic
> relocations for GOT are resolved.
> ---
> sysdeps/loongarch/configure | 37 ++++++++++++++++++++++++++++++++++
> sysdeps/loongarch/configure.ac | 14 +++++++++++++
> sysdeps/loongarch/start.S | 14 ++++++++++---
> 3 files changed, 62 insertions(+), 3 deletions(-)
>
> diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure
> index 43b54d4965..7e671241a8 100644
> --- a/sysdeps/loongarch/configure
> +++ b/sysdeps/loongarch/configure
> @@ -3,3 +3,40 @@
>
> $as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h
>
> +
> +
> +
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC is sufficient to build static PIE on LoongArch" >&5
> +$as_echo_n "checking if $CC is sufficient to build static PIE on LoongArch... " >&6; }
> +if ${libc_cv_static_pie_on_loongarch+:} false; then :
> + $as_echo_n "(cached) " >&6
> +else
> +
> +cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h. */
> +
> +int
> +main ()
> +{
> +
> +#if !defined __GNUC__ || __GNUC__ < 13
> +#error insufficient compiler for static PIE on LoongArch
> +#endif
> +
> + ;
> + return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_cpp "$LINENO"; then :
> + libc_cv_static_pie_on_loongarch=yes
> +else
> + libc_cv_static_pie_on_loongarch=no
> +fi
> +rm -f conftest.err conftest.i conftest.$ac_ext
> +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; }
> +if test "$libc_cv_static_pie_on_loongarch" = yes; then
> + $as_echo "#define SUPPORT_STATIC_PIE 1" >>confdefs.h
> +
> +fi
> diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac
> index f744367bf3..624897bfb3 100644
> --- a/sysdeps/loongarch/configure.ac
> +++ b/sysdeps/loongarch/configure.ac
> @@ -4,3 +4,17 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
> dnl It is always possible to access static and hidden symbols in an
> dnl position independent way.
> AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC)
> +
> +dnl test if GCC is new enough for static PIE.
> +AC_CACHE_CHECK([if $CC is sufficient to build static PIE on LoongArch],
> +libc_cv_static_pie_on_loongarch, [
> +AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[]], [[
> +#if !defined __GNUC__ || __GNUC__ < 13
> +#error insufficient compiler for static PIE on LoongArch
> +#endif
> +]])],
> + [libc_cv_static_pie_on_loongarch=yes],
> + [libc_cv_static_pie_on_loongarch=no])])
> +if test "$libc_cv_static_pie_on_loongarch" = yes; then
> + AC_DEFINE(SUPPORT_STATIC_PIE)
> +fi
I am not sure if checking compiler version is the best option, since this can
backported without breaking ABI. Maybe a best check would be to see if
-fpie/-fPIE and check if the required relocation if any is generated, as done
by s390x with 728894dba4a19578bd803906de184a8dd51ed13c.
> diff --git a/sysdeps/loongarch/start.S b/sysdeps/loongarch/start.S
> index e66af16d57..05cabd9b96 100644
> --- a/sysdeps/loongarch/start.S
> +++ b/sysdeps/loongarch/start.S
> @@ -60,9 +60,17 @@ ENTRY (ENTRY_POINT)
> cfi_undefined (1)
> or a5, a0, zero /* rtld_fini */
>
> +#if defined(PIC) && !defined(SHARED)
> +/* For static PIE, the GOT cannot be used in _start because the GOT entries are
> + offsets instead of real addresses before __libc_start_main. */
> +# 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. */
> - la.got a0, t0, main
> +# define LA la.got
> +#endif
> +
> + LA a0, t0, main
> REG_L a1, sp, 0
> ADDI a2, sp, SZREG
>
> @@ -73,9 +81,9 @@ ENTRY (ENTRY_POINT)
> move a4, zero /* used to be fini */
> or a6, sp, zero /* stack_end */
>
> - la.got ra, t0, __libc_start_main
> + LA ra, t0, __libc_start_main
> jirl ra, ra, 0
>
> - la.got ra, t0, abort
> + LA ra, t0, abort
> jirl ra, ra, 0
> END (ENTRY_POINT)
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-09-22 18:32 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-22 9:19 [PATCH 0/1] LoongArch: Add static PIE support Xi Ruoyao
2022-09-22 9:19 ` [PATCH 1/1] " Xi Ruoyao
2022-09-22 18:32 ` Adhemerval Zanella Netto
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).