Browse Source

xtensa: add static pie support

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Max Filippov 1 year ago
parent
commit
0c979facbd

+ 3 - 1
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

+ 2 - 0
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)

+ 1 - 1
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
 

+ 27 - 0
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