From: Andrew Pinski
call_weak_fn loads from a pointer, so use PTR_REG so the load
is 32bits for ILP32.
* sysdeps/aarch64/crti.S: Include sysdep.h
(call_weak_fn): Use PTR_REG when loading from
PREINIT_FUNCTION.
AARCH64: Make RTLD_START paramatizable
Make RTLD_START paramatizable for ILP32 and LP64 usage and provides common
code between ILP32.
* sysdeps/aarch64/dl-machine.h (RTLD_START): Rename to ...
(RTLD_START_1): This and add PTR, PTR_SIZE_LOG, and PTR_SP arguments.
(RTLD_START): New macro which uses RTLD_START_1.
Signed-off-by: Yury Norov
---
sysdeps/aarch64/crti.S | 3 +-
sysdeps/aarch64/dl-machine.h | 128 ++-
2 files changed, 69 insertions(+), 62 deletions(-)
diff --git a/sysdeps/aarch64/crti.S b/sysdeps/aarch64/crti.S
index 53ccb42..6e149b5 100644
--- a/sysdeps/aarch64/crti.S
+++ b/sysdeps/aarch64/crti.S
@@ -39,6 +39,7 @@
they can be called as functions. The symbols _init and _fini are
magic and cause the linker to emit DT_INIT and DT_FINI. */
+#include
#include
#ifndef PREINIT_FUNCTION
@@ -60,7 +61,7 @@
.type call_weak_fn, %function
call_weak_fn:
adrpx0, :got:PREINIT_FUNCTION
- ldr x0, [x0, #:got_lo12:PREINIT_FUNCTION]
+ ldr PTR_REG(0), [x0, #:got_lo12:PREINIT_FUNCTION]
cbz x0, 1f
b PREINIT_FUNCTION
1:
diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
index a16cb11..7a49852 100644
--- a/sysdeps/aarch64/dl-machine.h
+++ b/sysdeps/aarch64/dl-machine.h
@@ -126,68 +126,74 @@ elf_machine_runtime_setup (struct link_map *l, int lazy,
int profile)
/* Initial entry point for the dynamic linker. The C function
_dl_start is the real entry point, its return value is the user
program's entry point */
+#ifdef __LP64__
+#define RTLD_START RTLD_START_1("x", "3", "sp")
+#else
+#define RTLD_START RTLD_START_1("w", "2", "wsp")
+#endif
+
-#define RTLD_START asm ("\
-.text \n\
-.globl _start \n\
-.type _start, %function\n\
-.globl _dl_start_user \n\
-.type _dl_start_user, %function\n\
-_start:\n\
- mov x0, sp \n\
- bl _dl_start \n\
- // returns user entry point in x0 \n\
- mov x21, x0 \n\
-_dl_start_user:\n\
- // get the original arg count \n\
- ldr x1, [sp]\n\
- // get the argv address \n\
- add x2, sp, #8 \n\
- // get _dl_skip_args to see if we were \n\
- // invoked as an executable \n\
- adrpx4, _dl_skip_args \n\
-ldrw4, [x4, #:lo12:_dl_skip_args] \n\
- // do we need to adjust argc/argv \n\
-cmpw4, 0 \n\
- beq .L_done_stack_adjust\n\
- // subtract _dl_skip_args from original arg count \n\
- sub x1, x1, x4 \n\
- // store adjusted argc back to stack\n\
- str x1, [sp]\n\
- // find the first unskipped argument\n\
- mov x3, x2 \n\
- add x4, x2, x4, lsl #3 \n\
- // shuffle argv down\n\
-1: ldr x5, [x4], #8\n\
- str x5, [x3], #8\n\
- cmp x5, #0 \n\
- bne 1b \n\
- // shuffle envp down\n\
-1: ldr x5, [x4], #8\n\
- str x5, [x3], #8\n\
- cmp x5, #0 \n\
- bne 1b \n\
- // shuffle auxv down\n\
-1: ldp x0, x5, [x4, #16]! \n\
- stp x0, x5, [x3], #16 \n\
- cmp x0, #0 \n\
- bne 1b \n\
- //