diff options
Diffstat (limited to 'libc')
-rw-r--r-- | libc/sysdeps/linux/sh/Makefile | 15 | ||||
-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 |