Blame sysdeps/aarch64/start.S

Packit Service 82fcde
/* Copyright (C) 1995-2018 Free Software Foundation, Inc.
Packit Service 82fcde
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public License as
Packit Service 82fcde
   published by the Free Software Foundation; either version 2.1 of the
Packit Service 82fcde
   License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library.  If not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <sysdep.h>
Packit Service 82fcde
Packit Service 82fcde
/* This is the canonical entry point, usually the first thing in the text
Packit Service 82fcde
   segment.
Packit Service 82fcde
Packit Service 82fcde
   Note that the code in the .init section has already been run.
Packit Service 82fcde
   This includes _init and _libc_init
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
   At this entry point, most registers' values are unspecified, except:
Packit Service 82fcde
Packit Service 82fcde
   x0/w0	Contains a function pointer to be registered with `atexit'.
Packit Service 82fcde
		This is how the dynamic linker arranges to have DT_FINI
Packit Service 82fcde
		functions called for shared libraries that have been loaded
Packit Service 82fcde
		before this code runs.
Packit Service 82fcde
Packit Service 82fcde
   sp		The stack contains the arguments and environment:
Packit Service 82fcde
		0(sp)			argc
Packit Service 82fcde
		8(sp)			argv[0]
Packit Service 82fcde
		...
Packit Service 82fcde
		(8*argc)(sp)		NULL
Packit Service 82fcde
		(8*(argc+1))(sp)	envp[0]
Packit Service 82fcde
		...
Packit Service 82fcde
					NULL
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
	.text
Packit Service 82fcde
	.globl _start
Packit Service 82fcde
	.type _start,#function
Packit Service 82fcde
_start:
Packit Service 82fcde
	/* Create an initial frame with 0 LR and FP */
Packit Service 82fcde
	mov	x29, #0
Packit Service 82fcde
	mov	x30, #0
Packit Service 82fcde
Packit Service 82fcde
	/* Setup rtld_fini in argument register */
Packit Service 82fcde
	mov	x5, x0
Packit Service 82fcde
Packit Service 82fcde
	/* Load argc and a pointer to argv */
Packit Service 82fcde
	ldr	PTR_REG (1), [sp, #0]
Packit Service 82fcde
	add	x2, sp, #PTR_SIZE
Packit Service 82fcde
Packit Service 82fcde
	/* Setup stack limit in argument register */
Packit Service 82fcde
	mov	x6, sp
Packit Service 82fcde
Packit Service 82fcde
#ifdef PIC
Packit Service 82fcde
# ifdef SHARED
Packit Service 82fcde
        adrp    x0, :got:main
Packit Service 82fcde
	ldr     PTR_REG (0), [x0, #:got_lo12:main]
Packit Service 82fcde
Packit Service 82fcde
        adrp    x3, :got:__libc_csu_init
Packit Service 82fcde
	ldr     PTR_REG (3), [x3, #:got_lo12:__libc_csu_init]
Packit Service 82fcde
Packit Service 82fcde
        adrp    x4, :got:__libc_csu_fini
Packit Service 82fcde
	ldr     PTR_REG (4), [x4, #:got_lo12:__libc_csu_fini]
Packit Service 82fcde
# else
Packit Service 82fcde
	adrp	x0, __wrap_main
Packit Service 82fcde
	add	x0, x0, :lo12:__wrap_main
Packit Service 82fcde
	adrp	x3, __libc_csu_init
Packit Service 82fcde
	add	x3, x3, :lo12:__libc_csu_init
Packit Service 82fcde
	adrp	x4, __libc_csu_fini
Packit Service 82fcde
	add	x4, x4, :lo12:__libc_csu_fini
Packit Service 82fcde
# endif
Packit Service 82fcde
#else
Packit Service 82fcde
	/* Set up the other arguments in registers */
Packit Service 82fcde
	MOVL (0, main)
Packit Service 82fcde
	MOVL (3, __libc_csu_init)
Packit Service 82fcde
	MOVL (4, __libc_csu_fini)
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
	/* __libc_start_main (main, argc, argv, init, fini, rtld_fini,
Packit Service 82fcde
			      stack_end) */
Packit Service 82fcde
Packit Service 82fcde
	/* Let the libc call main and exit with its return code.  */
Packit Service 82fcde
	bl	__libc_start_main
Packit Service 82fcde
Packit Service 82fcde
	/* should never get here....*/
Packit Service 82fcde
	bl	abort
Packit Service 82fcde
Packit Service 82fcde
#if defined PIC && !defined SHARED
Packit Service 82fcde
	/* When main is not defined in the executable but in a shared library
Packit Service 82fcde
	   then a wrapper is needed in crt1.o of the static-pie enabled libc,
Packit Service 82fcde
	   because crt1.o and rcrt1.o share code and the later must avoid the
Packit Service 82fcde
	   use of GOT relocations before __libc_start_main is called.  */
Packit Service 82fcde
__wrap_main:
Packit Service 82fcde
	b	main
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
	/* Define a symbol for the first piece of initialized data.  */
Packit Service 82fcde
	.data
Packit Service 82fcde
	.globl __data_start
Packit Service 82fcde
__data_start:
Packit Service 82fcde
	.long 0
Packit Service 82fcde
	.weak data_start
Packit Service 82fcde
	data_start = __data_start