[git commit 0_9_30] 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).

Carmelo Amoroso carmelo.amoroso at st.com
Sat Oct 10 16:44:02 UTC 2009


commit: http://git.uclibc.org/uClibc/commit/?id=50466666d8fc3d055caf924f452b58b76756c5bf
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/0_9_30

Signed-off-by: Peter Griffin <pgriffin at mpc-data.co.uk>
Signed-off-by: Filippo Arcidiacono <filippo.arcidiacono at st.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop at gmail.com>
---
 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 1c3c544..9707f83 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, at -r15
 	mov.l r4, at -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, at -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, at -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 at GOTOFF
+L_init:
+	.long   _init at GOTOFF
+L_fini:
+	.long   _fini at GOTOFF
+L_uClibc_main:
+	.long   __uClibc_main at GOT
+L_abort:
+	.long   abort at 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
-- 
1.6.3.3



More information about the uClibc-cvs mailing list