diff options
author | Carmelo Amoroso <carmelo.amoroso@st.com> | 2008-08-08 07:28:02 +0000 |
---|---|---|
committer | Carmelo Amoroso <carmelo.amoroso@st.com> | 2008-08-08 07:28:02 +0000 |
commit | ea67a0ceabbe2a337bcf5e7593849a13224e2ff0 (patch) | |
tree | 2a8b65c3086c8595980135508a2f53cb349a900c /ldso | |
parent | 9581d701d8c3a966ee4a73a5221c257a1c1a1e58 (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.h | 14 |
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" ); |