OSDN Git Service

Add position independent code for crt1.S.
authorCarmelo Amoroso <carmelo.amoroso@st.com>
Tue, 5 May 2009 17:07:03 +0000 (19:07 +0200)
committerCarmelo Amoroso <carmelo.amoroso@st.com>
Tue, 5 May 2009 17:07:03 +0000 (19:07 +0200)
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>
libc/sysdeps/linux/sh/crt1.S

index 1c3c544..9707f83 100644 (file)
@@ -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