diff options
| -rw-r--r-- | libc/sysdeps/linux/sh/crt1.S | 45 | 
1 files changed, 45 insertions, 0 deletions
| diff --git a/libc/sysdeps/linux/sh/crt1.S b/libc/sysdeps/linux/sh/crt1.S index 1c3c54447..9707f8316 100644 --- a/libc/sysdeps/linux/sh/crt1.S +++ b/libc/sysdeps/linux/sh/crt1.S @@ -56,6 +56,35 @@ _start:  	/* Push the stack_end, rtld_fini and fini func onto the stack */  	mov.l r6,@-r15  	mov.l r4,@-r15 + +#ifdef __PIC__ +	mova  L_got, r0 +	mov.l L_got, r12 +	add r0, r12 + +	mov.l L_fini,r0 +	add r12, r0 +	mov.l r0,@-r15 + +	/* Set up the main/init funcs that go in registers */ +	mov.l L_main, r4 +	add r12, r4 +	mov.l L_init, r7 +	add r12, r7 + +	/* __uClibc_main (main, argc, argv, init, fini, rtld_fini, stack_end) */ + +	/* Let the libc call main and exit with its return code.  */ +	mov.l L_uClibc_main,r0 +	mov.l @(r0,r12),r1 +	jsr @r1 +	nop +	/* We should not get here. */ +	mov.l L_abort,r0 +	mov.l @(r0,r12),r1 +	jsr @r1 +	nop +#else  	mov.l L_fini,r0  	mov.l r0,@-r15 @@ -73,10 +102,25 @@ _start:  	mov.l L_abort,r1  	jmp @r1  	nop +#endif  	.size _start,.-_start  	.align	2 +#ifdef __PIC__ +L_got: +	.long	_GLOBAL_OFFSET_TABLE_ +L_main: +	.long	main@GOTOFF +L_init: +	.long   _init@GOTOFF +L_fini: +	.long   _fini@GOTOFF +L_uClibc_main: +	.long   __uClibc_main@GOT +L_abort: +	.long   abort@GOT +#else  L_main:  	.long   main  L_init: @@ -87,6 +131,7 @@ L_uClibc_main:  	.long   __uClibc_main  L_abort:  	.long   abort +#endif  /* Define a symbol for the first piece of initialized data.  */  	.data | 
