summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
Diffstat (limited to 'libc')
-rw-r--r--libc/sysdeps/linux/sh/Makefile15
-rw-r--r--libc/sysdeps/linux/sh/crt1.S (renamed from libc/sysdeps/linux/sh/crt0.S)99
2 files changed, 37 insertions, 77 deletions
diff --git a/libc/sysdeps/linux/sh/Makefile b/libc/sysdeps/linux/sh/Makefile
index 11c40aa73..f224acdbf 100644
--- a/libc/sysdeps/linux/sh/Makefile
+++ b/libc/sysdeps/linux/sh/Makefile
@@ -20,8 +20,9 @@
TOPDIR=../../../../
include $(TOPDIR)Rules.mak
-CRT0_SRC = crt0.S
-CRT0_OBJ = crt0.o crt1.o
+CRT_SRC = crt1.S
+CRT_OBJ = crt1.o
+SCRT_OBJ = $(patsubst %,S%, $(CRT_OBJ))
CTOR_TARGETS=$(TOPDIR)lib/crti.o $(TOPDIR)lib/crtn.o
SSRC=setjmp.S __longjmp.S vfork.S clone.S ___fpscr_values.S
@@ -36,15 +37,19 @@ OBJ_LIST=../../../obj.sysdeps.$(TARGET_ARCH)
all: $(OBJ_LIST)
-$(OBJ_LIST): $(OBJS) $(CRT0_OBJ) $(CTOR_TARGETS)
+$(OBJ_LIST): $(OBJS) $(CRT_OBJ) $(SCRT_OBJ) $(CTOR_TARGETS)
echo $(patsubst %, sysdeps/linux/$(TARGET_ARCH)/%, $(OBJS)) > $(OBJ_LIST)
$(INSTALL) -d $(TOPDIR)lib/
- cp $(CRT0_OBJ) $(TOPDIR)lib/
+ cp $(CRT_OBJ) $(SCRT_OBJ) $(TOPDIR)lib/
-$(CRT0_OBJ): $(CRT0_SRC)
+$(CRT_OBJ): $(CRT_SRC)
$(CC) $(ASFLAGS) -DL_$* $< -c -o $*.o
$(STRIPTOOL) -x -R .note -R .comment $*.o
+$(SCRT_OBJ): $(CRT_SRC)
+ $(CC) $(ASFLAGS) $(PIEFLAG) -DL_$* $< -c -o $*.o
+ $(STRIPTOOL) -x -R .note -R .comment $*.o
+
$(SOBJS): %.o : %.S
$(CC) $(ASFLAGS) -c $< -o $@
$(STRIPTOOL) -x -R .note -R .comment $*.o
diff --git a/libc/sysdeps/linux/sh/crt0.S b/libc/sysdeps/linux/sh/crt1.S
index 9a3936750..fc0ce355d 100644
--- a/libc/sysdeps/linux/sh/crt0.S
+++ b/libc/sysdeps/linux/sh/crt1.S
@@ -36,96 +36,51 @@
#include <features.h>
- .file "crt0.S"
.text
.globl _start
- .type _start,@function
- .type main,@function
- .size _start,_start_end - _start
+ .type _start,%function
+ .type main,%function
_start:
/* Clear the frame pointer since this is the outermost frame. */
mov #0, r14
/* Pop argc off the stack and save a pointer to argv */
- mov.l @r15+,r4
- mov r15, r5
-
-#if defined L_crt0 || ! 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
-
- /* jump to __uClibc_main (argc, argv, envp) */
- mov.l L_main, r0
- jsr @r0
- add r5, r6 /* delay slot */
+ mov.l @r15+,r5
+ mov r15, r6
- /* We should not get here. */
- mov.l L_abort, r0
- jmp @r0
- nop
+ /* Push the fini func onto the stack */
+ mov.l r4,@-r15
+ mov.l L_fini,r0
+ mov.l r0,@-r15
-_start_end:
- .align 2
+ /* Set up the main/init funcs that go in registers */
+ mov.l L_main,r4
+ mov.l L_init,r7
-L_main:
- .long __uClibc_main /* in libuClibc.*.so */
-
-#else /* (L_crt1) && __UCLIBC_CTOR_DTOR__ */
- /* Push the finip argument to __uClibc_start_main() onto the stack */
- mov.l L_fini,r6
- mov.l r6,@-r15
-
- /* Setup the value for the initp argument */
- mov.l L_init, r7
-
- /*
- * Setup the value for the environment pointer:
- * r6 = (argc + 1) * 4
- * r6 += argv (in delay slot)
- */
- mov r4,r6
- add #1,r6
- shll2 r6
-
- /* jump to __uClibc_start_main (argc, argv, envp, app_init, app_fini) */
- mov.l L_main, r0
- jsr @r0
- add r5, r6 /* delay slot */
+ /* __uClibc_main (main, argc, argv, init, fini) */
+
+ /* Let the libc call main and exit with its return code. */
+ mov.l L_uClibc_main,r1
+ jsr @r1
+ nop
/* We should not get here. */
- mov.l L_abort, r0
- jmp @r0
+ mov.l L_abort,r1
+ jmp @r1
nop
-_start_end:
+
+ .size _start,.-_start
.align 2
L_main:
- .long __uClibc_start_main /* in libuClibc.*.so */
-
- .weak _init
- .type _init,@function
-_init:
- rts
- nop
-
- .size _init,.-_init
- .weak _fini
- .set _fini,_init
-
+ .long main
L_init:
- .long _init
+ .long _init
L_fini:
- .long _fini
-
-#endif
-
+ .long _fini
+L_uClibc_main:
+ .long __uClibc_main
L_abort:
- .long abort
+ .long abort
/* Define a symbol for the first piece of initialized data. */
.data