diff options
Diffstat (limited to 'libc/sysdeps/linux/sh')
-rw-r--r-- | libc/sysdeps/linux/sh/crt0.S | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/libc/sysdeps/linux/sh/crt0.S b/libc/sysdeps/linux/sh/crt0.S index e74ae86c4..a27775ed0 100644 --- a/libc/sysdeps/linux/sh/crt0.S +++ b/libc/sysdeps/linux/sh/crt0.S @@ -48,6 +48,34 @@ _start: mov.l @r15+,r4 mov r15, r5 +#if ! defined __UCLIBC_CTOR_DTOR__ + /* + * Setup the value for the environment pointer: + * r6 = (argc + 1) * 4 + * r6 += argv (in delay slot) + */ + mov r4,r6 + add #1,r6 + shll2 r6 + add r5, r6 + + /* jump to __uClibc_main (argc, argv, envp) */ + mov.l L_main, r0 + jsr @r0 + nop /* delay slot */ + + /* We should not get here. */ + mov.l L_abort, r0 + jmp @r0 + nop + +_start_end: + .align 2 + +L_main: + .long __uClibc_main /* in libuClibc.*.so */ + +#else /* __UCLIBC_CTOR_DTOR__ */ /* Push the finip argument to __uClibc_start_main() onto the stack */ mov.l L_fini,r6 mov.l r6,@-r15 @@ -72,10 +100,12 @@ _start: mov.l L_abort, r0 jmp @r0 nop - _start_end: .align 2 +L_main: + .long __uClibc_start_main /* in libuClibc.*.so */ + .weak _init .type _init,@function _init: @@ -87,13 +117,13 @@ _init: .weak _fini .set _fini,_init -L_main: - .long __uClibc_start_main /* in libuClibc.*.so */ - L_init: .long _init L_fini: .long _fini + +#endif + L_abort: .long abort |