about summary refs log tree commit diff
path: root/arch/sh
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sh')
-rw-r--r--arch/sh/crt_arch.h28
-rw-r--r--arch/sh/reloc.h36
-rw-r--r--arch/sh/src/__fpscr_values.c2
3 files changed, 32 insertions, 34 deletions
diff --git a/arch/sh/crt_arch.h b/arch/sh/crt_arch.h
index 5fd39fc6..a873ffdb 100644
--- a/arch/sh/crt_arch.h
+++ b/arch/sh/crt_arch.h
@@ -1,12 +1,22 @@
-__asm__("\
-.global _start \n\
-_start: \n\
-	mov r15, r4 \n\
-	mov #-16, r0 \n\
-	and r0, r15 \n\
-	bsr __cstart \n\
-	nop \n\
-");
+__asm__(
+".global " START " \n"
+START ": \n"
+"	mova 1f, r0 \n"
+"	mov.l 1f, r5 \n"
+"	add r0, r5 \n"
+"	mov r15, r4 \n"
+"	mov #-16, r0 \n"
+"	and r0, r15 \n"
+"	bsr " START "_c \n"
+"	nop \n"
+".align 2 \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+"1:	.long _DYNAMIC-. \n"
+);
 
 /* used by gcc for switching the FPU between single and double precision */
+#ifdef SHARED
+__attribute__((__visibility__("hidden")))
+#endif
 const unsigned long __fpscr_values[2] = { 0, 0x80000 };
diff --git a/arch/sh/reloc.h b/arch/sh/reloc.h
index aeb02d05..e7e4b38f 100644
--- a/arch/sh/reloc.h
+++ b/arch/sh/reloc.h
@@ -8,27 +8,15 @@
 
 #define TPOFF_K 8
 
-static int remap_rel(int type)
-{
-	switch(type) {
-	case R_SH_DIR32:
-		return REL_SYMBOLIC;
-	case R_SH_REL32:
-		return REL_OFFSET;
-	case R_SH_GLOB_DAT:
-		return REL_GOT;
-	case R_SH_JMP_SLOT:
-		return REL_PLT;
-	case R_SH_RELATIVE:
-		return REL_RELATIVE;
-	case R_SH_COPY:
-		return REL_COPY;
-	case R_SH_TLS_DTPMOD32:
-		return REL_DTPMOD;
-	case R_SH_TLS_DTPOFF32:
-		return REL_DTPOFF;
-	case R_SH_TLS_TPOFF32:
-		return REL_TPOFF;
-	}
-	return 0;
-}
+#define REL_SYMBOLIC    R_SH_DIR32
+#define REL_OFFSET      R_SH_REL32
+#define REL_GOT         R_SH_GLOB_DAT
+#define REL_PLT         R_SH_JMP_SLOT
+#define REL_RELATIVE    R_SH_RELATIVE
+#define REL_COPY        R_SH_COPY
+#define REL_DTPMOD      R_SH_TLS_DTPMOD32
+#define REL_DTPOFF      R_SH_TLS_DTPOFF32
+#define REL_TPOFF       R_SH_TLS_TPOFF32
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+	"jmp @%0 ; mov %1,r15" : : "r"(pc), "r"(sp) : "memory" )
diff --git a/arch/sh/src/__fpscr_values.c b/arch/sh/src/__fpscr_values.c
index 64b458f9..374df30e 100644
--- a/arch/sh/src/__fpscr_values.c
+++ b/arch/sh/src/__fpscr_values.c
@@ -1,5 +1,5 @@
 #include "libc.h"
 
 /* used by gcc for switching the FPU between single and double precision */
-const unsigned long __fpscr_values[2] ATTR_LIBC_VISIBILITY = { 0, 0x80000 };
+//const unsigned long __fpscr_values[2] ATTR_LIBC_VISIBILITY = { 0, 0x80000 };