Browse Source

Added assembler version of startup code. Fix Makefile so it uses the new
code.

Tobias Anderberg 21 years ago
parent
commit
a6f671bc7c
2 changed files with 73 additions and 1 deletions
  1. 1 1
      libc/sysdeps/linux/cris/Makefile
  2. 72 0
      libc/sysdeps/linux/cris/crt0.S

+ 1 - 1
libc/sysdeps/linux/cris/Makefile

@@ -20,7 +20,7 @@ TOPDIR=../../../../
 include $(TOPDIR)Rules.mak
 ASFLAGS=$(CFLAGS)
 
-CRT0_SRC = crt0.c
+CRT0_SRC = crt0.S
 CRT0_OBJ = crt0.o crt1.o
 
 SSRC= setjmp.S __longjmp.S clone.S sysdep.S syscall.S

+ 72 - 0
libc/sysdeps/linux/cris/crt0.S

@@ -0,0 +1,72 @@
+;; Startup code compiant to the ELF CRIS ABI.
+;;
+;; Highly based on code from glibc.
+
+#include <sysdep.h>
+
+	.syntax no_register_prefix
+
+	.text
+	.globl	_start
+	.type	_start,@function
+
+#if defined L_crt0 || ! defined __UCLIBC_CTOR_DTOR__
+	.type	__uClibc_main,@function
+#else
+	.weak	_init
+	.weak	_fini
+	.type	__uClibc_start_main,@function
+#endif
+
+	;; Setup a dummy reference to main so that if an application is linking
+	;; when the main() function is in a static library we can be sure that
+	;; the main() actually gets linked in.
+	.type main,@function
+
+_start:
+	;; Clear the frame pointer, to mark the outermost frame.
+	moveq	0, r8
+
+	move.d	[sp],r11
+	move.d	sp,[sp]
+	move.d	sp,r12
+	addq	4,r12
+	push	r9
+
+#ifdef __PIC__
+	move.d	pc,r0
+	sub.d	.:GOTOFF,r0
+	move.d	_init:PLTG,r13
+	add.d	r0,r13
+	move.d	_fini:PLTG,r9
+	add.d	r0,r9
+	move.d	main:PLTG,r10
+	add.d	r0,r10
+#else
+	move.d	_init,r13
+	move.d	_fini,r9
+	move.d	main,r10
+#endif
+
+	push r9
+
+#if (defined L_crt1 || defined L_gcrt1) && defined __UCLIBC_CTOR_DTOR__
+	PLTCALL(__uClibc_start_main)
+#else
+	PLTCALL(__uClibc_main)
+#endif
+
+	;; Crash if 'exit' returns.
+	test.d	[6502]
+0:
+	ba 0b
+	nop
+	
+	;; 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