[PATCH v2] ARC: Enable shared crt1
Vineet Gupta
Vineet.Gupta1 at synopsys.com
Thu Jun 23 11:51:15 UTC 2016
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 at uclibc.org <uclibc at uclibc.org>
Cc: devel at uclibc-ng.org <devel at uclibc-ng.org>
Cc: Cupertino Miranda <cmiranda at synopsys.com>
Signed-off-by: Vineet Gupta <vgupta at 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 at pcl
+ add r3, pcl, @_init at pcl
+ add r4, pcl, @_fini at pcl
+#else
mov_s r0, main
mov_s r3, _init
mov r4, _fini
-
+#endif
and sp, sp, -8
mov r6, sp
--
2.5.0
More information about the uClibc
mailing list