From d501ad45e35b79af56b469fbd8a5bf9df0d16505 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Tue, 9 Aug 2005 04:54:18 +0000 Subject: update crt0 to crt1 based heavily on glibc start.S and to sync up with __uClibc_main changes --- libc/sysdeps/linux/sh/Makefile | 15 +++-- libc/sysdeps/linux/sh/crt0.S | 136 ----------------------------------------- libc/sysdeps/linux/sh/crt1.S | 91 +++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 141 deletions(-) delete mode 100644 libc/sysdeps/linux/sh/crt0.S create mode 100644 libc/sysdeps/linux/sh/crt1.S (limited to 'libc/sysdeps') 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/crt0.S deleted file mode 100644 index 9a3936750..000000000 --- a/libc/sysdeps/linux/sh/crt0.S +++ /dev/null @@ -1,136 +0,0 @@ -/* Startup code for SH & ELF. - Copyright (C) 1999 Free Software Foundation, Inc. - Copyright (C) 2001 Hewlett-Packard Australia - Copyright (C) 2002 Stefan Allius - - This program is free software; you can redistribute it and/or modify it under - the terms of the GNU Library General Public License as published by the Free - Software Foundation; either version 2 of the License, or (at your option) any - later version. - - This program is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more - details. - - You should have received a copy of the GNU Library General Public License - along with this program; if not, write to the Free Software Foundation, Inc., - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - -/* This is the canonical entry point, usually the first thing in the text - segment. - - At this entry point, most registers' values are unspecified, except: - - sp The stack contains the arguments and environment: - 0(sp) argc - 4(sp) argv[0] - ... - (4*argc)(sp) NULL - (4*(argc+1))(sp) envp[0] - ... - NULL -*/ - -#include - - .file "crt0.S" - .text - .globl _start - .type _start,@function - .type main,@function - .size _start,_start_end - _start -_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 */ - - /* 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 /* (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 */ - /* We should not get here. */ - 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: - rts - nop - - .size _init,.-_init - .weak _fini - .set _fini,_init - -L_init: - .long _init -L_fini: - .long _fini - -#endif - -L_abort: - .long abort - -/* Define a symbol for the first piece of initialized data. */ - .data - .globl __data_start -__data_start: - .long 0 - .weak data_start - data_start = __data_start diff --git a/libc/sysdeps/linux/sh/crt1.S b/libc/sysdeps/linux/sh/crt1.S new file mode 100644 index 000000000..fc0ce355d --- /dev/null +++ b/libc/sysdeps/linux/sh/crt1.S @@ -0,0 +1,91 @@ +/* Startup code for SH & ELF. + Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 2001 Hewlett-Packard Australia + Copyright (C) 2002 Stefan Allius + + This program is free software; you can redistribute it and/or modify it under + the terms of the GNU Library General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more + details. + + You should have received a copy of the GNU Library General Public License + along with this program; if not, write to the Free Software Foundation, Inc., + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +/* This is the canonical entry point, usually the first thing in the text + segment. + + At this entry point, most registers' values are unspecified, except: + + sp The stack contains the arguments and environment: + 0(sp) argc + 4(sp) argv[0] + ... + (4*argc)(sp) NULL + (4*(argc+1))(sp) envp[0] + ... + NULL +*/ + +#include + + .text + .globl _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+,r5 + mov r15, r6 + + /* Push the fini func onto the stack */ + mov.l r4,@-r15 + mov.l L_fini,r0 + mov.l r0,@-r15 + + /* Set up the main/init funcs that go in registers */ + mov.l L_main,r4 + mov.l L_init,r7 + + /* __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,r1 + jmp @r1 + nop + + .size _start,.-_start + .align 2 + +L_main: + .long main +L_init: + .long _init +L_fini: + .long _fini +L_uClibc_main: + .long __uClibc_main +L_abort: + .long abort + +/* Define a symbol for the first piece of initialized data. */ + .data + .globl __data_start +__data_start: + .long 0 + .weak data_start + data_start = __data_start -- cgit v1.2.3