diff mbox

[uclibc-ng-devel,v2] ARC: Enable shared crt1

Message ID 1466682675-5301-1-git-send-email-vgupta@synopsys.com
State Accepted
Headers show

Commit Message

Vineet Gupta June 23, 2016, 11:51 a.m. UTC
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: devel@uclibc-ng.org <devel@uclibc-ng.org>
Cc: Cupertino Miranda <cmiranda@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
---
 libc/sysdeps/linux/arc/crt1.S | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Comments

Waldemar Brodkorb June 26, 2016, 10:05 a.m. UTC | #1
Hi Vineet,
Vineet Gupta wrote,

> 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: devel@uclibc-ng.org <devel@uclibc-ng.org>
> Cc: Cupertino Miranda <cmiranda@synopsys.com>
> Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
> ---
>  libc/sysdeps/linux/arc/crt1.S | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)

Applied and pushed,
 thx
  Waldemar
diff mbox

Patch

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