Browse Source

update crt0 to crt1 based heavily on glibc start.S and to sync up with __uClibc_main changes

Mike Frysinger 19 years ago
parent
commit
d501ad45e3
2 changed files with 37 additions and 77 deletions
  1. 10 5
      libc/sysdeps/linux/sh/Makefile
  2. 27 72
      libc/sysdeps/linux/sh/crt1.S

+ 10 - 5
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

+ 27 - 72
libc/sysdeps/linux/sh/crt0.S → 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