summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarmelo Amoroso <carmelo.amoroso@st.com>2009-05-05 19:07:03 +0200
committerCarmelo Amoroso <carmelo.amoroso@st.com>2009-05-05 19:07:03 +0200
commit299875982700738db39a0dccd1cd6a0f333e9994 (patch)
tree37d00b0bc4a86d0ef45c7cd5f6f71df6a36a614f
parent4d1b93953f0a82732b8d9b8280a07730b78a2194 (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.S45
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