path: root/libc
diff options
authorVineet Gupta <>2016-06-23 11:51:15 (GMT)
committerWaldemar Brodkorb <>2016-06-23 18:48:25 (GMT)
commit2c3be84e73fa4013608e9b348386ddff91ae0c8c (patch)
treec828ba4f11ef6f97e7b67d326c4f79f8558f1588 /libc
parente58bacb7ec462912e843fc616288995db88b7275 (diff)
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 <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: <> Cc: <> Cc: Cupertino Miranda <> Signed-off-by: Vineet Gupta <>
Diffstat (limited to 'libc')
1 files changed, 6 insertions, 2 deletions
diff --git a/libc/sysdeps/linux/arc/crt1.S b/libc/sysdeps/linux/arc/crt1.S
index 0fe3cf9..178c5b4 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
mov_s r0, main
mov_s r3, _init
mov r4, _fini
and sp, sp, -8
mov r6, sp