base: dynamic linking support of crt0.s on ARM 64-bit

* added global offset table relative loading for global symbols
* removed 'initial_sp' and 'initial_x0' because they are currently not
  used on this platform. If required they are easy to resurrect.

issue #3260
This commit is contained in:
Sebastian Sumpf 2019-04-04 11:36:43 +02:00 committed by Christian Helmuth
parent f0d28eeca7
commit 7dc875e8c7

View File

@ -24,19 +24,13 @@
.global _start_initial_stack .global _start_initial_stack
_start_initial_stack: _start_initial_stack:
/* make initial value of some registers available to higher-level code */
ldr x4, =__initial_sp
mov x5, sp
str x5, [x4]
ldr x4, =__initial_x0
str x0, [x4]
/* /*
* Install initial temporary environment that is replaced later by the * Install initial temporary environment that is replaced later by the
* environment that init_main_thread creates. * environment that init_main_thread creates.
*/ */
ldr x4, =_stack_high adrp x4, :got:__initial_stack_high
mov sp, x4 ldr x4, [x4, #:got_lo12:__initial_stack_high]
mov sp, x4
/* if this is the dynamic linker, init_rtld relocates the linker */ /* if this is the dynamic linker, init_rtld relocates the linker */
bl init_rtld bl init_rtld
@ -45,8 +39,9 @@
bl init_main_thread bl init_main_thread
/* apply environment that was created by init_main_thread */ /* apply environment that was created by init_main_thread */
ldr x4, =init_main_thread_result adrp x4, :got:init_main_thread_result
ldr x4, [x4] ldr x4, [x4, #:got_lo12:init_main_thread_result]
ldr x4, [x4]
mov sp, x4 mov sp, x4
/* jump into init C code instead of calling it as it should never return */ /* jump into init C code instead of calling it as it should never return */
@ -57,20 +52,12 @@
** .bss (non-initialized data) ** ** .bss (non-initialized data) **
*********************************/ *********************************/
.section ".bss" .bss
/* stack of the temporary initial environment */ /* stack of the temporary initial environment */
.p2align 8 .p2align 8
.global __initial_stack_base .global __initial_stack_base
__initial_stack_base: __initial_stack_base:
.space 12*1024 .space 12*1024
_stack_high: .global __initial_stack_high
__initial_stack_high:
/* initial value of the SP register */
.global __initial_sp
__initial_sp:
.space 8
/* initial value of the X0 register */
.global __initial_x0
__initial_x0:
.space 8