summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux
diff options
context:
space:
mode:
authorCarmelo Amoroso <carmelo.amoroso@st.com>2008-08-08 07:28:02 +0000
committerCarmelo Amoroso <carmelo.amoroso@st.com>2008-08-08 07:28:02 +0000
commitea67a0ceabbe2a337bcf5e7593849a13224e2ff0 (patch)
tree2a8b65c3086c8595980135508a2f53cb349a900c /libc/sysdeps/linux
parent9581d701d8c3a966ee4a73a5221c257a1c1a1e58 (diff)
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>
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r--libc/sysdeps/linux/sh/crt1.S10
1 files changed, 8 insertions, 2 deletions
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