1/* Startup code for ARM & ELF 2 Copyright (C) 1995-2021 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 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 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 In addition to the permissions in the GNU Lesser General Public 11 License, the Free Software Foundation gives you unlimited 12 permission to link the compiled version of this file with other 13 programs, and to distribute those programs without any restriction 14 coming from the use of this file. (The GNU Lesser General Public 15 License restrictions do apply in other respects; for example, they 16 cover modification of the file, and distribution when not linked 17 into another program.) 18 19 Note that people who make modified versions of this file are not 20 obligated to grant this special exception for their modified 21 versions; it is their choice whether to do so. The GNU Lesser 22 General Public License gives permission to release a modified 23 version without this exception; this exception also makes it 24 possible to release a modified version which carries forward this 25 exception. 26 27 The GNU C Library is distributed in the hope that it will be useful, 28 but WITHOUT ANY WARRANTY; without even the implied warranty of 29 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 30 Lesser General Public License for more details. 31 32 You should have received a copy of the GNU Lesser General Public 33 License along with the GNU C Library. If not, see 34 <https://www.gnu.org/licenses/>. */ 35 36/* This is the canonical entry point, usually the first thing in the text 37 segment. 38 39 Note that the code in the .init section has already been run. 40 This includes _init and _libc_init 41 42 43 At this entry point, most registers' values are unspecified, except: 44 45 a1 Contains a function pointer to be registered with `atexit'. 46 This is how the dynamic linker arranges to have DT_FINI 47 functions called for shared libraries that have been loaded 48 before this code runs. 49 50 sp The stack contains the arguments and environment: 51 0(sp) argc 52 4(sp) argv[0] 53 ... 54 (4*argc)(sp) NULL 55 (4*(argc+1))(sp) envp[0] 56 ... 57 NULL 58*/ 59 60/* Tag_ABI_align8_preserved: This code preserves 8-byte 61 alignment in any callee. */ 62 .eabi_attribute 25, 1 63/* Tag_ABI_align8_needed: This code may require 8-byte alignment from 64 the caller. */ 65 .eabi_attribute 24, 1 66 67#if defined(__thumb2__) 68 .thumb 69 .syntax unified 70#endif 71 72 .text 73 .globl _start 74 .type _start,#function 75_start: 76 /* Protect against unhandled exceptions. */ 77 .fnstart 78 /* Clear the frame pointer and link register since this is the outermost frame. */ 79 mov fp, #0 80 mov lr, #0 81 82 /* Pop argc off the stack and save a pointer to argv */ 83 pop { a2 } 84 mov a3, sp 85 86 /* Push stack limit */ 87 push { a3 } 88 89 /* Push rtld_fini */ 90 push { a1 } 91 92#ifdef PIC 93 ldr sl, .L_GOT 94 adr a4, .L_GOT 95 add sl, sl, a4 96 97 mov a4, #0 /* Used to be init. */ 98 push { a4 } /* Used to be fini. */ 99 100 ldr a1, .L_GOT+4 /* main */ 101 ldr a1, [sl, a1] 102 103 /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */ 104 /* Let the libc call main and exit with its return code. */ 105 bl __libc_start_main(PLT) 106#else 107 108 mov a4, #0 /* Used to init. */ 109 push { a4 } /* Used to fini. */ 110 ldr a1, =main 111 112 /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */ 113 /* Let the libc call main and exit with its return code. */ 114 bl __libc_start_main 115#endif 116 117 /* should never get here....*/ 118 bl abort 119 120#ifdef PIC 121 .align 2 122.L_GOT: 123 .word _GLOBAL_OFFSET_TABLE_ - .L_GOT 124 .word main(GOT) 125#endif 126 127 .cantunwind 128 .fnend 129 130/* Define a symbol for the first piece of initialized data. */ 131 .data 132 .globl __data_start 133__data_start: 134 .long 0 135 .weak data_start 136 data_start = __data_start 137