1 /* Copyright (C) 1995-2015 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public License as
7 published by the Free Software Foundation; either version 2.1 of the
8 License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library. If not, see
17 <http://www.gnu.org/licenses/>. */
19 /* This is the canonical entry point, usually the first thing in the text
22 Note that the code in the .init section has already been run.
23 This includes _init and _libc_init
26 At this entry point, most registers' values are unspecified, except:
28 x0 Contains a function pointer to be registered with `atexit'.
29 This is how the dynamic linker arranges to have DT_FINI
30 functions called for shared libraries that have been loaded
31 before this code runs.
33 sp The stack contains the arguments and environment:
38 (8*(argc+1))(sp) envp[0]
45 .type _start,#function
47 /* Create an initial frame with 0 LR and FP */
51 /* Setup rtld_fini in argument register */
54 /* Load argc and a pointer to argv */
58 /* Setup stack limit in argument register */
63 ldr x0, [x0, #:got_lo12:main]
65 adrp x3, :got:__libc_csu_init
66 ldr x3, [x3, #:got_lo12:__libc_csu_init]
68 adrp x4, :got:__libc_csu_fini
69 ldr x4, [x4, #:got_lo12:__libc_csu_fini]
71 /* Set up the other arguments in registers */
73 ldr x3, =__libc_csu_init
74 ldr x4, =__libc_csu_fini
77 /* __libc_start_main (main, argc, argv, init, fini, rtld_fini,
80 /* Let the libc call main and exit with its return code. */
83 /* should never get here....*/
86 /* Define a symbol for the first piece of initialized data. */
92 data_start = __data_start