diff options
author | Carmelo Amoroso <carmelo.amoroso@st.com> | 2009-05-05 19:07:03 +0200 |
---|---|---|
committer | Carmelo Amoroso <carmelo.amoroso@st.com> | 2009-05-05 19:07:03 +0200 |
commit | 299875982700738db39a0dccd1cd6a0f333e9994 (patch) | |
tree | 37d00b0bc4a86d0ef45c7cd5f6f71df6a36a614f | |
parent | 4d1b93953f0a82732b8d9b8280a07730b78a2194 (diff) |
Add position independent code for crt1.S.
This will generate a Scrt1.o that is linked to executabled
when compiled as PIE code (position independent executable) without
requiring relocation in .text section (not allowed on uclibc/sh4).
Signed-off-by: Peter Griffin <pgriffin@mpc-data.co.uk>
Signed-off-by: Filippo Arcidiacono <filippo.arcidiacono@st.com>
-rw-r--r-- | libc/sysdeps/linux/sh/crt1.S | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/sh/crt1.S b/libc/sysdeps/linux/sh/crt1.S index 1c3c54447..9707f8316 100644 --- a/libc/sysdeps/linux/sh/crt1.S +++ b/libc/sysdeps/linux/sh/crt1.S @@ -56,6 +56,35 @@ _start: /* Push the stack_end, rtld_fini and fini func onto the stack */ mov.l r6,@-r15 mov.l r4,@-r15 + +#ifdef __PIC__ + mova L_got, r0 + mov.l L_got, r12 + add r0, r12 + + mov.l L_fini,r0 + add r12, r0 + mov.l r0,@-r15 + + /* Set up the main/init funcs that go in registers */ + mov.l L_main, r4 + add r12, r4 + mov.l L_init, r7 + add r12, r7 + + /* __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,r0 + mov.l @(r0,r12),r1 + jsr @r1 + nop + /* We should not get here. */ + mov.l L_abort,r0 + mov.l @(r0,r12),r1 + jsr @r1 + nop +#else mov.l L_fini,r0 mov.l r0,@-r15 @@ -73,10 +102,25 @@ _start: mov.l L_abort,r1 jmp @r1 nop +#endif .size _start,.-_start .align 2 +#ifdef __PIC__ +L_got: + .long _GLOBAL_OFFSET_TABLE_ +L_main: + .long main@GOTOFF +L_init: + .long _init@GOTOFF +L_fini: + .long _fini@GOTOFF +L_uClibc_main: + .long __uClibc_main@GOT +L_abort: + .long abort@GOT +#else L_main: .long main L_init: @@ -87,6 +131,7 @@ L_uClibc_main: .long __uClibc_main L_abort: .long abort +#endif /* Define a symbol for the first piece of initialized data. */ .data |