summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ldso/ldso/sh/dl-syscalls.h1
-rw-r--r--libc/sysdeps/linux/sh/Makefile23
-rw-r--r--libc/sysdeps/linux/sh/___fpscr_values.S34
-rw-r--r--libc/sysdeps/linux/sh/crt1.S (renamed from libc/sysdeps/linux/sh/crt0.S)106
-rw-r--r--libc/sysdeps/linux/sh/longjmp.c3
5 files changed, 74 insertions, 93 deletions
diff --git a/ldso/ldso/sh/dl-syscalls.h b/ldso/ldso/sh/dl-syscalls.h
index f0f4baed8..dc0cc6164 100644
--- a/ldso/ldso/sh/dl-syscalls.h
+++ b/ldso/ldso/sh/dl-syscalls.h
@@ -3,4 +3,3 @@
extern int _dl_errno;
#define __set_errno(X) {(_dl_errno) = (X);}
#include "sys/syscall.h"
-
diff --git a/libc/sysdeps/linux/sh/Makefile b/libc/sysdeps/linux/sh/Makefile
index 3532ef2b9..f224acdbf 100644
--- a/libc/sysdeps/linux/sh/Makefile
+++ b/libc/sysdeps/linux/sh/Makefile
@@ -20,35 +20,36 @@
TOPDIR=../../../../
include $(TOPDIR)Rules.mak
-CFLAGS+= -I../
-ASFLAGS+=-I.. -D__ASSEMBLER__
-
-CRT0_SRC = crt0.S
-CRT0_OBJ = crt0.o crt1.o
-CRT0_DEPS=gmon-start.S
+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
+SSRC=setjmp.S __longjmp.S vfork.S clone.S ___fpscr_values.S
SOBJS=$(patsubst %.S,%.o, $(SSRC))
CSRC=mmap.c longjmp.c pipe.c __init_brk.c brk.c sbrk.c syscall.c pread_write.c
COBJS=$(patsubst %.c,%.o, $(CSRC))
-OBJS=$(SOBJS) $(MOBJ) $(COBJS)
+OBJS=$(SOBJS) $(COBJS)
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/___fpscr_values.S b/libc/sysdeps/linux/sh/___fpscr_values.S
new file mode 100644
index 000000000..de8f0b42d
--- /dev/null
+++ b/libc/sysdeps/linux/sh/___fpscr_values.S
@@ -0,0 +1,34 @@
+/* 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
+*/
+
+#include <features.h>
+
+.data
+#if defined(__CONFIG_SH4__)
+.global ___fpscr_values
+.type ___fpscr_values,@object
+.size ___fpscr_values,8
+___fpscr_values:
+ .long 0
+ .long 0x80000
+
+.weak __fpscr_values
+ __fpscr_values = ___fpscr_values
+#endif
diff --git a/libc/sysdeps/linux/sh/crt0.S b/libc/sysdeps/linux/sh/crt1.S
index 6851698d5..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
@@ -134,10 +89,3 @@ __data_start:
.long 0
.weak data_start
data_start = __data_start
-#if defined __CONFIG_SH4__
- .global __fpscr_values
-__fpscr_values:
- .long 0
- .long 0x80000
-#endif
-
diff --git a/libc/sysdeps/linux/sh/longjmp.c b/libc/sysdeps/linux/sh/longjmp.c
index 14e32d502..c36344cd1 100644
--- a/libc/sysdeps/linux/sh/longjmp.c
+++ b/libc/sysdeps/linux/sh/longjmp.c
@@ -25,7 +25,6 @@
#include <signal.h>
extern int __longjmp(char *env, int val);
-extern int __sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
/* Set the signal mask to the one specified in ENV, and jump
to the position specified in ENV, causing the setjmp
@@ -34,7 +33,7 @@ void __libc_siglongjmp (sigjmp_buf env, int val)
{
if (env[0].__mask_was_saved)
/* Restore the saved signal mask. */
- (void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
+ (void) sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
(sigset_t *) NULL);
/* Call the machine-dependent function to restore machine state. */