From 2c3be84e73fa4013608e9b348386ddff91ae0c8c Mon Sep 17 00:00:00 2001 From: Vineet Gupta Date: Thu, 23 Jun 2016 17:21:15 +0530 Subject: ARC: Enable shared crt1 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
: | 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 Cc: devel@uclibc-ng.org Cc: Cupertino Miranda Signed-off-by: Vineet Gupta --- 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 0fe3cf997..178c5b44f 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 -- cgit v1.2.3