Currently crt1 takes address of functions (main,_init,_fini) directly
which doesn't generate truely position independent code, but zero based
values instead. e.g.

|  __start:
|        ...
|       add_s   r2,sp,0x4
|       mov_s   r0, main

generates to

|  000156ec <__start>:
|  ...
|     156f4:    add_s   r2,sp,0x4
|     156f6:    mov_s   r0,0x15f7c
|  ...
|  00015f7c <main>:
|     15f7c:    push_s  blink

This works just fine for the normal (non PIE) dynamic executables since
they are loaded at address 0. However this is not true for PIE
executables. So for Scrt1 we use a true position independent way when
taking function addresses.

Cc: uclibc@uclibc.org <uclibc@uclibc.org>
Cc: de...@uclibc-ng.org <de...@uclibc-ng.org>
Cc: Cupertino Miranda <cmira...@synopsys.com>
Signed-off-by: Vineet Gupta <vgu...@synopsys.com>
---
 libc/sysdeps/linux/arc/crt1.S | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/libc/sysdeps/linux/arc/crt1.S b/libc/sysdeps/linux/arc/crt1.S
index 95c41f888850..e38c8e81b2c0 100644
--- a/libc/sysdeps/linux/arc/crt1.S
+++ b/libc/sysdeps/linux/arc/crt1.S
@@ -41,11 +41,15 @@ __start:
 
        mov_s   r5, r0          ; rltd_fini
        add_s   r2, sp, 4       ; argv
-
+#ifdef L_Scrt1
+       add     r0, pcl, @main@pcl
+       add     r3, pcl, @_init@pcl
+       add     r4, pcl, @_fini@pcl
+#else
        mov_s   r0, main
        mov_s   r3, _init
        mov     r4, _fini
-
+#endif
        and     sp, sp, -8
        mov     r6, sp
 
-- 
2.5.0

_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to