diff mbox series

[uclibc-ng-devel,v2,5/5] xtensa: add static pie support

Message ID 20220915193054.2916840-6-jcmvbkbc@gmail.com
State Accepted
Headers show
Series add static PIE support for xtensa | expand

Commit Message

Max Filippov Sept. 15, 2022, 7:30 p.m. UTC
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
 extra/Configs/Config.in                |  4 +++-
 ldso/ldso/xtensa/dl-startup.h          |  2 ++
 libc/misc/internals/reloc_static_pie.c |  2 +-
 libc/sysdeps/linux/xtensa/crt1.S       | 27 ++++++++++++++++++++++++++
 4 files changed, 33 insertions(+), 2 deletions(-)

Comments

linted Sept. 20, 2022, 5:51 p.m. UTC | #1
Tested this along with the patches for binutils and gcc. Everything is
working for me when tested with buildroot's qemu_xtensa_lx60_defconfig and
qemu.

On Thu, Sep 15, 2022 at 3:31 PM Max Filippov <jcmvbkbc@gmail.com> wrote:

> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
> ---
>  extra/Configs/Config.in                |  4 +++-
>  ldso/ldso/xtensa/dl-startup.h          |  2 ++
>  libc/misc/internals/reloc_static_pie.c |  2 +-
>  libc/sysdeps/linux/xtensa/crt1.S       | 27 ++++++++++++++++++++++++++
>  4 files changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in
> index 43c04fd0a271..dd1beaadcee3 100644
> --- a/extra/Configs/Config.in
> +++ b/extra/Configs/Config.in
> @@ -324,7 +324,9 @@ config DOPIC
>  config STATIC_PIE
>         bool "Add support for Static Position Independent Executables
> (PIE)"
>         default n
> -       depends on DOPIC && !UCLIBC_FORMAT_FDPIC_ELF && (TARGET_arm ||
> TARGET_i386 || TARGET_x86_64 || TARGET_aarch64 || TARGET_mips)
> +       depends on DOPIC && !UCLIBC_FORMAT_FDPIC_ELF && \
> +               (TARGET_arm || TARGET_i386 || TARGET_x86_64 ||
> TARGET_aarch64 || \
> +                TARGET_mips || TARGET_xtensa)
>
>  config ARCH_HAS_NO_SHARED
>         bool
> diff --git a/ldso/ldso/xtensa/dl-startup.h b/ldso/ldso/xtensa/dl-startup.h
> index 439bdbd7a5e2..c9350c0f201e 100644
> --- a/ldso/ldso/xtensa/dl-startup.h
> +++ b/ldso/ldso/xtensa/dl-startup.h
> @@ -7,6 +7,7 @@
>   * Parts taken from glibc/sysdeps/xtensa/dl-machine.h.
>   */
>
> +#ifndef L_rcrt1
>  __asm__ (
>      "  .text\n"
>      "  .align  4\n"
> @@ -81,6 +82,7 @@ __asm__ (
>      "  addi    a5, a5, 8\n"
>      "  bnez    a6, 3b\n"
>      "  j      .Lfixup_stack_ret");
> +#endif
>
>  /* Get a pointer to the argv value.  */
>  #define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS) + 1)
> diff --git a/libc/misc/internals/reloc_static_pie.c
> b/libc/misc/internals/reloc_static_pie.c
> index ce42cb9b30df..ab1923024c2b 100644
> --- a/libc/misc/internals/reloc_static_pie.c
> +++ b/libc/misc/internals/reloc_static_pie.c
> @@ -21,7 +21,7 @@
>  #include <dl-elf.h>
>
>  #include <ldso.h>
> -#ifdef __mips__
> +#if defined(__mips__) || defined(__xtensa__)
>  #include <dl-startup.h>
>  #endif
>
> diff --git a/libc/sysdeps/linux/xtensa/crt1.S
> b/libc/sysdeps/linux/xtensa/crt1.S
> index efbe264c03f0..3fa14ae583a9 100644
> --- a/libc/sysdeps/linux/xtensa/crt1.S
> +++ b/libc/sysdeps/linux/xtensa/crt1.S
> @@ -76,9 +76,26 @@
>         .global _start
>         .type   _start, @function
>  _start:
> +#ifdef L_rcrt1
> +       .begin  no-transform
> +       call0   1f
> +.Lret_addr:
> +       .end    no-transform
> +       .align  4
> +1:
> +#endif
>  #if defined(__XTENSA_WINDOWED_ABI__)
> +#ifdef L_rcrt1
> +       movi    a6, .Lret_addr
> +       sub     a6, a0, a6
> +       movi    a0, 0
> +       movi    a4, reloc_static_pie
> +       add     a4, a4, a6
> +       callx4  a4
> +#else
>         /* Clear a0 to obviously mark the outermost frame.  */
>         movi    a0, 0
> +#endif
>
>         /* Load up the user's main function.  */
>         movi    a6, main
> @@ -106,8 +123,18 @@ _start:
>         movi    a4, __uClibc_main
>         callx4  a4
>  #elif defined(__XTENSA_CALL0_ABI__)
> +#ifdef L_rcrt1
> +       mov     a12, a2
> +       movi    a2, .Lret_addr
> +       sub     a2, a0, a2
> +       movi    a0, reloc_static_pie
> +       add     a0, a0, a2
> +       callx0  a0
> +       mov     a7, a12
> +#else
>         /* Setup the shared library termination function.  */
>         mov     a7, a2
> +#endif
>
>         /* Load up the user's main function.  */
>         movi    a2, main
> --
> 2.30.2
>
>
diff mbox series

Patch

diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in
index 43c04fd0a271..dd1beaadcee3 100644
--- a/extra/Configs/Config.in
+++ b/extra/Configs/Config.in
@@ -324,7 +324,9 @@  config DOPIC
 config STATIC_PIE
 	bool "Add support for Static Position Independent Executables (PIE)"
 	default n
-	depends on DOPIC && !UCLIBC_FORMAT_FDPIC_ELF && (TARGET_arm || TARGET_i386 || TARGET_x86_64 || TARGET_aarch64 || TARGET_mips)
+	depends on DOPIC && !UCLIBC_FORMAT_FDPIC_ELF && \
+		(TARGET_arm || TARGET_i386 || TARGET_x86_64 || TARGET_aarch64 || \
+		 TARGET_mips || TARGET_xtensa)
 
 config ARCH_HAS_NO_SHARED
 	bool
diff --git a/ldso/ldso/xtensa/dl-startup.h b/ldso/ldso/xtensa/dl-startup.h
index 439bdbd7a5e2..c9350c0f201e 100644
--- a/ldso/ldso/xtensa/dl-startup.h
+++ b/ldso/ldso/xtensa/dl-startup.h
@@ -7,6 +7,7 @@ 
  * Parts taken from glibc/sysdeps/xtensa/dl-machine.h.
  */
 
+#ifndef L_rcrt1
 __asm__ (
     "	.text\n"
     "	.align  4\n"
@@ -81,6 +82,7 @@  __asm__ (
     "	addi    a5, a5, 8\n"
     "	bnez    a6, 3b\n"
     "	j      .Lfixup_stack_ret");
+#endif
 
 /* Get a pointer to the argv value.  */
 #define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS) + 1)
diff --git a/libc/misc/internals/reloc_static_pie.c b/libc/misc/internals/reloc_static_pie.c
index ce42cb9b30df..ab1923024c2b 100644
--- a/libc/misc/internals/reloc_static_pie.c
+++ b/libc/misc/internals/reloc_static_pie.c
@@ -21,7 +21,7 @@ 
 #include <dl-elf.h>
 
 #include <ldso.h>
-#ifdef __mips__
+#if defined(__mips__) || defined(__xtensa__)
 #include <dl-startup.h>
 #endif
 
diff --git a/libc/sysdeps/linux/xtensa/crt1.S b/libc/sysdeps/linux/xtensa/crt1.S
index efbe264c03f0..3fa14ae583a9 100644
--- a/libc/sysdeps/linux/xtensa/crt1.S
+++ b/libc/sysdeps/linux/xtensa/crt1.S
@@ -76,9 +76,26 @@ 
 	.global	_start
 	.type	_start, @function
 _start:
+#ifdef L_rcrt1
+	.begin	no-transform
+	call0	1f
+.Lret_addr:
+	.end	no-transform
+	.align	4
+1:
+#endif
 #if defined(__XTENSA_WINDOWED_ABI__)
+#ifdef L_rcrt1
+	movi	a6, .Lret_addr
+	sub	a6, a0, a6
+	movi	a0, 0
+	movi	a4, reloc_static_pie
+	add	a4, a4, a6
+	callx4	a4
+#else
 	/* Clear a0 to obviously mark the outermost frame.  */
 	movi	a0, 0
+#endif
 
 	/* Load up the user's main function.  */
 	movi	a6, main
@@ -106,8 +123,18 @@  _start:
 	movi	a4, __uClibc_main
 	callx4	a4
 #elif defined(__XTENSA_CALL0_ABI__)
+#ifdef L_rcrt1
+	mov	a12, a2
+	movi	a2, .Lret_addr
+	sub	a2, a0, a2
+	movi	a0, reloc_static_pie
+	add	a0, a0, a2
+	callx0	a0
+	mov	a7, a12
+#else
 	/* Setup the shared library termination function.  */
 	mov	a7, a2
+#endif
 
 	/* Load up the user's main function.  */
 	movi	a2, main