summaryrefslogtreecommitdiff
path: root/ldso
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 /ldso
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 'ldso')
-rw-r--r--ldso/ldso/sh/dl-startup.h14
1 files changed, 12 insertions, 2 deletions
diff --git a/ldso/ldso/sh/dl-startup.h b/ldso/ldso/sh/dl-startup.h
index 3e59093fa..05e282bd8 100644
--- a/ldso/ldso/sh/dl-startup.h
+++ b/ldso/ldso/sh/dl-startup.h
@@ -12,10 +12,20 @@ __asm__(
" bsrf r0\n"
" add #4, r4\n"
".jmp_loc:\n"
- " jmp @r0\n"
- " mov #0, r4 !call _start with arg == 0\n"
+ " mov r0, r8 ! Save the user entry point address in r8\n"
+ " mov.l .L_got, r12 ! Load the GOT on r12\n"
+ " mova .L_got, r0\n"
+ " add r0, r12\n"
+ " mov.l .L_dl_fini, r0\n"
+ " mov.l @(r0,r12), r4 ! Pass the finalizer in r4\n"
+ " jmp @r8\n"
+ " nop\n"
".L_dl_start:\n"
" .long _dl_start-.jmp_loc\n"
+ ".L_dl_fini:\n"
+ " .long _dl_fini@GOT\n"
+ ".L_got:\n"
+ " .long _GLOBAL_OFFSET_TABLE_\n"
" .size _start,.-_start\n"
" .previous\n"
);