diff options
| author | linted <linted@users.noreply.github.com> | 2022-08-20 16:41:38 -0400 | 
|---|---|---|
| committer | Waldemar Brodkorb <wbx@openadk.org> | 2022-09-07 08:32:47 +0200 | 
| commit | 365da5ab379a3e38e196cad370695c4b300cfe51 (patch) | |
| tree | aa4eeb3a03c03dcd11570247b328086f2c9208ac /libc/sysdeps | |
| parent | d46709504efa46e5b9b52739a48ab61b39fd4971 (diff) | |
Added support for creation of Static Position-Independent Executables (PIE) on mips
Updated config to allow compilation of rcrt1.o for mips and modified it's crt1.S to perform relocates in __start.
The mips architecture performs relocations differently then most other architectures. reloc_static_pie was rewritten, taking code from dl-startup.c, in order to perfrom the additional relocations. Modifications were made to mips' dl-startup.h to allow for the use of contained macros without including _start definition.
Signed-off-by: linted <linted@users.noreply.github.com>
Diffstat (limited to 'libc/sysdeps')
| -rw-r--r-- | libc/sysdeps/linux/mips/crt1.S | 23 | 
1 files changed, 23 insertions, 0 deletions
| diff --git a/libc/sysdeps/linux/mips/crt1.S b/libc/sysdeps/linux/mips/crt1.S index 083615515..7c4db447c 100644 --- a/libc/sysdeps/linux/mips/crt1.S +++ b/libc/sysdeps/linux/mips/crt1.S @@ -78,6 +78,10 @@  	.weak	_init  	.weak	_fini  #endif +#ifdef L_rcrt1 +	.type	reloc_static_pie,@function +	.hidden	.L0 +#endif  	.type	    main,@function  	.type	    __uClibc_main,@function  	.ent	__start @@ -90,6 +94,25 @@ __start:  	PTR_LA $28, _gp             /* Setup GP correctly if we're non-PIC.  */  	move $31, $0  #endif +#ifdef L_rcrt1 +	PTR_LA $4, _DYNAMIC           /* Place _DYNAMIC into the GOT */ +	REG_S $4, -0x7ff0($28)        /* offset to GOT stolen from dl-startup */ +	jal .L0                       /* Get the current $pc address */ +.L0: +	PTR_SUBU $4, $31, $25         /* Calculate load addr */ +	move $31, $0                  /* Clear ra */ +	and $29, -2 * SZREG           /* Ensure stack is aligned */ +	PTR_ADDIU $29, (-2 * SZREG)   /* Allocate 2 register spaces on stack */ +	REG_S $2, SZREG($29)          /* Store atexit in case it exists */ +	PTR_LA $5, reloc_static_pie   /* function calls before relocation +	                                 don't work unless we set $t9 manually */ +	PTR_ADDU $25, $4, $5          /* store reloc_static_pie in $t9 */ +	jalr $25                      /* call reloc_static_pie */ +	nop							  /* delay slot, just in case */ +	REG_L $2, SZREG($29)          /* cleanup stack */ +	PTR_ADDIU $29, $29, (2 * SZREG) + +#endif  	PTR_LA $4, main		/* main */  	PTR_L $5, 0($29)		/* argc */ | 
