(_start): Leave most of the initialisation for __libc_start_main().
[kopensolaris-gnu/glibc.git] / sysdeps / arm / elf / start.S
1 /* Startup code for ARM & ELF
2    Copyright (C) 1995, 1996, 1997, 1998 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 Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9
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    Library General Public License for more details.
14
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
19
20 /* This is the canonical entry point, usually the first thing in the text
21    segment.
22
23         Note that the code in the .init section has already been run.
24         This includes _init and _libc_init
25
26
27         At this entry point, most registers' values are unspecified, except:
28
29    a1           Contains a function pointer to be registered with `atexit'.
30                 This is how the dynamic linker arranges to have DT_FINI
31                 functions called for shared libraries that have been loaded
32                 before this code runs.
33
34    sp           The stack contains the arguments and environment:
35                 0(sp)                   argc
36                 4(sp)                   argv[0]
37                 ...
38                 (4*argc)(sp)            NULL
39                 (4*(argc+1))(sp)        envp[0]
40                 ...
41                                         NULL
42 */
43
44         .text
45         .globl _start
46 _start:
47         /* Clear the frame pointer since this is the outermost frame.  */
48         mov fp, #0
49
50         /* Pop argc off the stack and save a pointer to argv */
51         ldmfd sp!, {a2}
52         mov a3, sp
53
54         /* Push the last arguments to main() onto the stack */
55         stmfd sp!, {a1}
56         ldr a1, =_fini
57         stmfd sp!, {a1}
58
59         /* Set up the other arguments for main() that go in registers */
60         ldr a1, =main
61         ldr a4, =_init
62
63         /* __libc_start_main (main, argc, argv, init, fini, rtld_fini) */
64
65         /* Let the libc call main and exit with its return code.  */
66         bl __libc_start_main
67         /* should never get here....*/
68         bl abort
69
70 /* Define a symbol for the first piece of initialized data.  */
71         .data
72         .globl __data_start
73 __data_start:
74         .long 0
75         .weak data_start
76         data_start = __data_start