summaryrefslogtreecommitdiff
path: root/aarch64-Move-ld.so-_start-to-separate-file-and-drop-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'aarch64-Move-ld.so-_start-to-separate-file-and-drop-.patch')
-rw-r--r--aarch64-Move-ld.so-_start-to-separate-file-and-drop-.patch188
1 files changed, 188 insertions, 0 deletions
diff --git a/aarch64-Move-ld.so-_start-to-separate-file-and-drop-.patch b/aarch64-Move-ld.so-_start-to-separate-file-and-drop-.patch
new file mode 100644
index 0000000..15738b9
--- /dev/null
+++ b/aarch64-Move-ld.so-_start-to-separate-file-and-drop-.patch
@@ -0,0 +1,188 @@
+From 1da064c015dce624cb19fcdc0bace7af2bd8caec Mon Sep 17 00:00:00 2001
+From: Szabolcs Nagy <szabolcs.nagy@arm.com>
+Date: Thu, 30 Dec 2021 17:08:36 +0000
+Subject: [PATCH 4/4] aarch64: Move ld.so _start to separate file and drop
+ _dl_skip_args
+
+Conflict:NA
+Reference:https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=1da064c015dce624cb19fcdc0bace7af2bd8caec
+
+A separate asm file is easier to maintain than a macro that expands to
+inline asm.
+
+The RTLD_START macro is only needed now because _dl_start is local in
+rtld.c, but _start has to call it, if _dl_start was made hidden then it
+could be empty.
+
+_dl_skip_args is no longer needed.
+
+Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
+---
+ sysdeps/aarch64/Makefile | 1 +
+ sysdeps/aarch64/dl-machine.h | 77 +-----------------------------------
+ sysdeps/aarch64/dl-start.S | 53 +++++++++++++++++++++++++
+ 3 files changed, 56 insertions(+), 75 deletions(-)
+ create mode 100644 sysdeps/aarch64/dl-start.S
+
+diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile
+index 7183895d04..17fb1c5b72 100644
+--- a/sysdeps/aarch64/Makefile
++++ b/sysdeps/aarch64/Makefile
+@@ -33,6 +33,7 @@ tst-audit27-ENV = LD_AUDIT=$(objpfx)tst-auditmod27.so
+ endif
+
+ ifeq ($(subdir),elf)
++sysdep-rtld-routines += dl-start
+ sysdep-dl-routines += tlsdesc dl-tlsdesc
+ gen-as-const-headers += dl-link.sym
+
+diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
+index b40050a981..fe120bb507 100644
+--- a/sysdeps/aarch64/dl-machine.h
++++ b/sysdeps/aarch64/dl-machine.h
+@@ -105,81 +105,8 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
+ return lazy;
+ }
+
+-/* 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_1(PTR, PTR_SIZE_LOG, PTR_SP) asm ("\
+-.text \n\
+-.globl _start \n\
+-.type _start, %function \n\
+-.globl _dl_start_user \n\
+-.type _dl_start_user, %function \n\
+-_start: \n\
+- // bti c \n\
+- hint 34 \n\
+- mov " PTR "0, " PTR_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 " PTR "1, [sp] \n\
+- // get the argv address \n\
+- add " PTR "2, " PTR_SP ", #(1<<" PTR_SIZE_LOG ") \n\
+- // get _dl_skip_args to see if we were \n\
+- // invoked as an executable \n\
+- adrp x4, _dl_skip_args \n\
+- ldr w4, [x4, #:lo12:_dl_skip_args] \n\
+- // do we need to adjust argc/argv \n\
+- cmp w4, 0 \n\
+- beq .L_done_stack_adjust \n\
+- // subtract _dl_skip_args from original arg count \n\
+- sub " PTR "1, " PTR "1, " PTR "4 \n\
+- // store adjusted argc back to stack \n\
+- str " PTR "1, [sp] \n\
+- // find the first unskipped argument \n\
+- mov " PTR "3, " PTR "2 \n\
+- add " PTR "4, " PTR "2, " PTR "4, lsl #" PTR_SIZE_LOG " \n\
+- // shuffle argv down \n\
+-1: ldr " PTR "5, [x4], #(1<<" PTR_SIZE_LOG ") \n\
+- str " PTR "5, [x3], #(1<<" PTR_SIZE_LOG ") \n\
+- cmp " PTR "5, #0 \n\
+- bne 1b \n\
+- // shuffle envp down \n\
+-1: ldr " PTR "5, [x4], #(1<<" PTR_SIZE_LOG ") \n\
+- str " PTR "5, [x3], #(1<<" PTR_SIZE_LOG ") \n\
+- cmp " PTR "5, #0 \n\
+- bne 1b \n\
+- // shuffle auxv down \n\
+-1: ldp " PTR "0, " PTR "5, [x4, #(2<<" PTR_SIZE_LOG ")]! \n\
+- stp " PTR "0, " PTR "5, [x3], #(2<<" PTR_SIZE_LOG ") \n\
+- cmp " PTR "0, #0 \n\
+- bne 1b \n\
+- // Update _dl_argv \n\
+- adrp x3, __GI__dl_argv \n\
+- str " PTR "2, [x3, #:lo12:__GI__dl_argv] \n\
+-.L_done_stack_adjust: \n\
+- // compute envp \n\
+- add " PTR "3, " PTR "2, " PTR "1, lsl #" PTR_SIZE_LOG " \n\
+- add " PTR "3, " PTR "3, #(1<<" PTR_SIZE_LOG ") \n\
+- adrp x16, _rtld_local \n\
+- add " PTR "16, " PTR "16, #:lo12:_rtld_local \n\
+- ldr " PTR "0, [x16] \n\
+- bl _dl_init \n\
+- // load the finalizer function \n\
+- adrp x0, _dl_fini \n\
+- add " PTR "0, " PTR "0, #:lo12:_dl_fini \n\
+- // jump to the user_s entry point \n\
+- mov x16, x21 \n\
+- br x16 \n\
+-");
++/* In elf/rtld.c _dl_start should be global so dl-start.S can reference it. */
++#define RTLD_START asm (".globl _dl_start");
+
+ #define elf_machine_type_class(type) \
+ ((((type) == AARCH64_R(JUMP_SLOT) \
+diff --git a/sysdeps/aarch64/dl-start.S b/sysdeps/aarch64/dl-start.S
+new file mode 100644
+index 0000000000..a3a57bd5a1
+--- /dev/null
++++ b/sysdeps/aarch64/dl-start.S
+@@ -0,0 +1,53 @@
++/* ld.so _start code.
++ Copyright (C) 2022 Free Software Foundation, Inc.
++
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <https://www.gnu.org/licenses/>. */
++
++#include <sysdep.h>
++
++ENTRY (_start)
++ /* Create an initial frame with 0 LR and FP */
++ cfi_undefined (x30)
++ mov x29, #0
++ mov x30, #0
++
++ mov x0, sp
++ PTR_ARG (0)
++ bl _dl_start
++ /* Returns user entry point in x0. */
++ mov PTR_REG (21), PTR_REG (0)
++.globl _dl_start_user
++.type _dl_start_user, %function
++_dl_start_user:
++ /* Get argc. */
++ ldr PTR_REG (1), [sp]
++ /* Get argv. */
++ add x2, sp, PTR_SIZE
++ /* Compute envp. */
++ add PTR_REG (3), PTR_REG (2), PTR_REG (1), lsl PTR_LOG_SIZE
++ add PTR_REG (3), PTR_REG (3), PTR_SIZE
++ adrp x16, _rtld_local
++ add PTR_REG (16), PTR_REG (16), :lo12:_rtld_local
++ ldr PTR_REG (0), [x16]
++ bl _dl_init
++ /* Load the finalizer function. */
++ adrp x0, _dl_fini
++ add PTR_REG (0), PTR_REG (0), :lo12:_dl_fini
++ /* Jump to the user's entry point. */
++ mov x16, x21
++ br x16
++END (_start)
+--
+2.27.0
+