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 |