From ea67a0ceabbe2a337bcf5e7593849a13224e2ff0 Mon Sep 17 00:00:00 2001
From: Carmelo Amoroso <carmelo.amoroso@st.com>
Date: Fri, 8 Aug 2008 07:28:02 +0000
Subject: Fix SH ldso sequence startup.

Pass via r4 the rtld finalizer
_dl_fini to the user application. This will be the 6^ arg of
__uClibc_main and will be registered with 'atexit'.
In this way the dynamic linker will be able to call destructors
defined within the loaded DSOs.

Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
Acked-by: Paul Mundt <lethal@linux-sh.org>

Add missing 7th arg "stack_end".
add comment of undocumented usage of r4.
fix comment of expected __uClibc_main() prototype.

Signed-off-by: Yoshii Takashi <yoshii.takashi@renesas.com>
Acked-by: Paul Mundt <lethal@linux-sh.org>
---
 libc/sysdeps/linux/sh/crt1.S | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

(limited to 'libc')

diff --git a/libc/sysdeps/linux/sh/crt1.S b/libc/sysdeps/linux/sh/crt1.S
index fc0ce355d..1c3c54447 100644
--- a/libc/sysdeps/linux/sh/crt1.S
+++ b/libc/sysdeps/linux/sh/crt1.S
@@ -24,6 +24,11 @@
 
 	At this entry point, most registers' values are unspecified, except:
 
+   r4	Contains a function pointer to be registered with `atexit'.
+		This is how the dynamic linker arranges to have DT_FINI
+		functions called for shared libraries that have been loaded
+		before this code runs.
+
    sp		The stack contains the arguments and environment:
    		0(sp)			argc
 		4(sp)			argv[0]
@@ -48,7 +53,8 @@ _start:
 	mov.l @r15+,r5
 	mov r15, r6
 
-	/* Push the fini func onto the stack */
+	/* Push the stack_end, rtld_fini and fini func onto the stack */
+	mov.l r6,@-r15
 	mov.l r4,@-r15
 	mov.l L_fini,r0
 	mov.l r0,@-r15
@@ -57,7 +63,7 @@ _start:
 	mov.l L_main,r4
 	mov.l L_init,r7
 
-	/* __uClibc_main (main, argc, argv, init, fini) */
+	/* __uClibc_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
 
 	/* Let the libc call main and exit with its return code.  */
 	mov.l L_uClibc_main,r1
-- 
cgit v1.2.3