]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/arm/elf/start.S
MIPS: replace bits/socket.h with bits/socket_type.h.
[thirdparty/glibc.git] / sysdeps / arm / elf / start.S
CommitLineData
df27fae1 1/* Startup code for ARM & ELF
856cb777 2 Copyright (C) 1995, 1996, 1997, 1998, 2001, 2002, 2005, 2008
f10eff58 3 Free Software Foundation, Inc.
df27fae1
UD
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
3214b89b
AJ
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
df27fae1 10
0bec0145
RM
11 In addition to the permissions in the GNU Lesser General Public
12 License, the Free Software Foundation gives you unlimited
13 permission to link the compiled version of this file with other
14 programs, and to distribute those programs without any restriction
15 coming from the use of this file. (The GNU Lesser General Public
16 License restrictions do apply in other respects; for example, they
17 cover modification of the file, and distribution when not linked
18 into another program.)
19
20 Note that people who make modified versions of this file are not
21 obligated to grant this special exception for their modified
22 versions; it is their choice whether to do so. The GNU Lesser
23 General Public License gives permission to release a modified
24 version without this exception; this exception also makes it
25 possible to release a modified version which carries forward this
26 exception.
27
df27fae1
UD
28 The GNU C Library is distributed in the hope that it will be useful,
29 but WITHOUT ANY WARRANTY; without even the implied warranty of
30 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3214b89b 31 Lesser General Public License for more details.
df27fae1 32
3214b89b
AJ
33 You should have received a copy of the GNU Lesser General Public
34 License along with the GNU C Library; if not, write to the Free
35 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
36 02111-1307 USA. */
df27fae1
UD
37
38/* This is the canonical entry point, usually the first thing in the text
39 segment.
40
41 Note that the code in the .init section has already been run.
42 This includes _init and _libc_init
43
44
e7304fce 45 At this entry point, most registers' values are unspecified, except:
df27fae1 46
e7304fce 47 a1 Contains a function pointer to be registered with `atexit'.
13906e12 48 This is how the dynamic linker arranges to have DT_FINI
df27fae1
UD
49 functions called for shared libraries that have been loaded
50 before this code runs.
51
52 sp The stack contains the arguments and environment:
13906e12 53 0(sp) argc
e7304fce 54 4(sp) argv[0]
df27fae1 55 ...
e7304fce
UD
56 (4*argc)(sp) NULL
57 (4*(argc+1))(sp) envp[0]
df27fae1
UD
58 ...
59 NULL
60*/
27489557
DG
61
62#if defined(__ARM_EABI__)
63/* Tag_ABI_align8_preserved: This code preserves 8-byte
64 alignment in any callee. */
65 .eabi_attribute 25, 1
66/* Tag_ABI_align8_needed: This code may require 8-byte alignment from
67 the caller. */
68 .eabi_attribute 24, 1
69#endif
70
5631abde
JM
71#if defined(__thumb2__)
72 .thumb
73 .syntax unified
74#endif
df27fae1
UD
75
76 .text
77 .globl _start
791746df 78 .type _start,#function
df27fae1 79_start:
f10eff58
DJ
80#if !defined(__USING_SJLJ_EXCEPTIONS__)
81 /* Protect against unhandled exceptions. */
82 .fnstart
83#endif
856cb777 84 /* Clear the frame pointer and link register since this is the outermost frame. */
df27fae1 85 mov fp, #0
856cb777 86 mov lr, #0
df27fae1 87
e7304fce 88 /* Pop argc off the stack and save a pointer to argv */
a16ce997 89 ldr a2, [sp], #4
e7304fce
UD
90 mov a3, sp
91
a16ce997
UD
92 /* Push stack limit */
93 str a3, [sp, #-4]!
94
95 /* Push rtld_fini */
96 str a1, [sp, #-4]!
e7304fce 97
856cb777
DJ
98#ifdef SHARED
99 ldr sl, .L_GOT
b5c2620b
JB
100 adr a4, .L_GOT
101 add sl, sl, a4
856cb777
DJ
102
103 ldr ip, .L_GOT+4 /* __libc_csu_fini */
104 ldr ip, [sl, ip]
105
106 str ip, [sp, #-4]! /* Push __libc_csu_fini */
107
108 ldr a4, .L_GOT+8 /* __libc_csu_init */
109 ldr a4, [sl, a4]
110
111 ldr a1, .L_GOT+12 /* main */
112 ldr a1, [sl, a1]
113
114 /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
115 /* Let the libc call main and exit with its return code. */
116 bl __libc_start_main(PLT)
117#else
118 /* Fetch address of __libc_csu_fini */
119 ldr ip, =__libc_csu_fini
120
121 /* Push __libc_csu_fini */
122 str ip, [sp, #-4]!
123
a16ce997 124 /* Set up the other arguments in registers */
e7304fce 125 ldr a1, =main
f8a26bed 126 ldr a4, =__libc_csu_init
e7304fce 127
a16ce997 128 /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
e7304fce
UD
129 /* Let the libc call main and exit with its return code. */
130 bl __libc_start_main
856cb777 131#endif
a16ce997 132
df27fae1
UD
133 /* should never get here....*/
134 bl abort
135
856cb777 136#ifdef SHARED
e5cd24d4 137 .align 2
856cb777 138.L_GOT:
b5c2620b 139 .word _GLOBAL_OFFSET_TABLE_ - .L_GOT
856cb777
DJ
140 .word __libc_csu_fini(GOT)
141 .word __libc_csu_init(GOT)
142 .word main(GOT)
143#endif
144
145
f10eff58
DJ
146#if !defined(__USING_SJLJ_EXCEPTIONS__)
147 .cantunwind
148 .fnend
149#endif
150
df27fae1
UD
151/* Define a symbol for the first piece of initialized data. */
152 .data
153 .globl __data_start
154__data_start:
155 .long 0
156 .weak data_start
157 data_start = __data_start