summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/sh
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/sh')
-rw-r--r--libc/sysdeps/linux/sh/crt0.S38
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