]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/arm/start.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / arm / start.S
CommitLineData
df27fae1 1/* Startup code for ARM & ELF
b168057a 2 Copyright (C) 1995-2015 Free Software Foundation, Inc.
df27fae1
UD
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
3214b89b
AJ
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.
df27fae1 9
0bec0145
RM
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
df27fae1
UD
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
3214b89b 30 Lesser General Public License for more details.
df27fae1 31
3214b89b 32 You should have received a copy of the GNU Lesser General Public
ab84e3ff
PE
33 License along with the GNU C Library. If not, see
34 <http://www.gnu.org/licenses/>. */
df27fae1
UD
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
e7304fce 43 At this entry point, most registers' values are unspecified, except:
df27fae1 44
e7304fce 45 a1 Contains a function pointer to be registered with `atexit'.
13906e12 46 This is how the dynamic linker arranges to have DT_FINI
df27fae1
UD
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:
13906e12 51 0(sp) argc
e7304fce 52 4(sp) argv[0]
df27fae1 53 ...
e7304fce
UD
54 (4*argc)(sp) NULL
55 (4*(argc+1))(sp) envp[0]
df27fae1
UD
56 ...
57 NULL
58*/
27489557 59
27489557
DG
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
27489557 66
5631abde
JM
67#if defined(__thumb2__)
68 .thumb
69 .syntax unified
70#endif
df27fae1
UD
71
72 .text
73 .globl _start
791746df 74 .type _start,#function
df27fae1 75_start:
f10eff58
DJ
76 /* Protect against unhandled exceptions. */
77 .fnstart
856cb777 78 /* Clear the frame pointer and link register since this is the outermost frame. */
df27fae1 79 mov fp, #0
856cb777 80 mov lr, #0
df27fae1 81
e7304fce 82 /* Pop argc off the stack and save a pointer to argv */
55668624 83 pop { a2 }
e7304fce
UD
84 mov a3, sp
85
a16ce997 86 /* Push stack limit */
55668624 87 push { a3 }
a16ce997
UD
88
89 /* Push rtld_fini */
55668624 90 push { a1 }
e7304fce 91
856cb777
DJ
92#ifdef SHARED
93 ldr sl, .L_GOT
b5c2620b
JB
94 adr a4, .L_GOT
95 add sl, sl, a4
856cb777
DJ
96
97 ldr ip, .L_GOT+4 /* __libc_csu_fini */
98 ldr ip, [sl, ip]
99
55668624 100 push { ip } /* Push __libc_csu_fini */
856cb777
DJ
101
102 ldr a4, .L_GOT+8 /* __libc_csu_init */
103 ldr a4, [sl, a4]
104
105 ldr a1, .L_GOT+12 /* main */
106 ldr a1, [sl, a1]
107
108 /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
109 /* Let the libc call main and exit with its return code. */
110 bl __libc_start_main(PLT)
111#else
112 /* Fetch address of __libc_csu_fini */
113 ldr ip, =__libc_csu_fini
114
115 /* Push __libc_csu_fini */
55668624 116 push { ip }
856cb777 117
a16ce997 118 /* Set up the other arguments in registers */
e7304fce 119 ldr a1, =main
f8a26bed 120 ldr a4, =__libc_csu_init
e7304fce 121
a16ce997 122 /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
e7304fce
UD
123 /* Let the libc call main and exit with its return code. */
124 bl __libc_start_main
856cb777 125#endif
a16ce997 126
df27fae1
UD
127 /* should never get here....*/
128 bl abort
129
856cb777 130#ifdef SHARED
e5cd24d4 131 .align 2
856cb777 132.L_GOT:
b5c2620b 133 .word _GLOBAL_OFFSET_TABLE_ - .L_GOT
856cb777
DJ
134 .word __libc_csu_fini(GOT)
135 .word __libc_csu_init(GOT)
136 .word main(GOT)
137#endif
138
f10eff58
DJ
139 .cantunwind
140 .fnend
f10eff58 141
df27fae1
UD
142/* Define a symbol for the first piece of initialized data. */
143 .data
144 .globl __data_start
145__data_start:
146 .long 0
147 .weak data_start
148 data_start = __data_start