diff options
Diffstat (limited to 'libc/sysdeps')
| -rw-r--r-- | libc/sysdeps/linux/arm/crt0.S | 17 | 
1 files changed, 17 insertions, 0 deletions
| diff --git a/libc/sysdeps/linux/arm/crt0.S b/libc/sysdeps/linux/arm/crt0.S index 455d35d2d..f58885d17 100644 --- a/libc/sysdeps/linux/arm/crt0.S +++ b/libc/sysdeps/linux/arm/crt0.S @@ -93,11 +93,22 @@ _start:  #endif  #if (defined L_crt1 ) && defined __UCLIBC_CTOR_DTOR__ +#ifdef __PIC__ +	/* Store the address of _init in r3 as an argument to main() */ +	adr r5, .L_init +	ldr r3, .L_init +	add r3, r3, r5 + +	/* Push _fini onto the stack as the final argument to main() */ +	ldr r4, .L_init + 4 +	add r4, r4, r5 +#else  	/* Store the address of _init in r3 as an argument to main() */  	ldr r3, =_init  	/* Push _fini onto the stack as the final argument to main() */  	ldr r4, =_fini +#endif  	stmfd sp!, {r4}  	/* Ok, now run uClibc's main() -- shouldn't return */ @@ -109,6 +120,12 @@ _start:  	/* Crash if somehow `exit' returns anyways.  */  	bl abort +#if (defined L_crt1 ) && defined __UCLIBC_CTOR_DTOR__ && defined __PIC__ +.L_init: +	.word _init - .L_init +	.word _fini - .L_init +#endif +  /* We need this stuff to make gdb behave itself, otherwise     gdb will chokes with SIGILL when trying to debug apps.  */ | 
