]>
Commit | Line | Data |
---|---|---|
f41c8091 | 1 | /* Startup code for elf32-sparc |
688903eb | 2 | Copyright (C) 1997-2018 Free Software Foundation, Inc. |
41bdb6e2 | 3 | This file is part of the GNU C Library. |
f41c8091 UD |
4 | Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997. |
5 | ||
6 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 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. | |
f41c8091 | 10 | |
92c6ccd1 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 | ||
f41c8091 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 | |
41bdb6e2 | 31 | Lesser General Public License for more details. |
f41c8091 | 32 | |
41bdb6e2 | 33 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
34 | License along with the GNU C Library; if not, see |
35 | <http://www.gnu.org/licenses/>. */ | |
f41c8091 UD |
36 | |
37 | #include <sysdep.h> | |
38 | ||
39 | ||
40 | .section ".text" | |
41 | .align 4 | |
42 | .global _start | |
43 | .type _start,#function | |
44 | _start: | |
4c595adb | 45 | #ifdef SHARED |
3d2b3019 | 46 | SETUP_PIC_REG(l7) |
4c595adb UD |
47 | #endif |
48 | ||
f41c8091 UD |
49 | /* Terminate the stack frame, and reserve space for functions to |
50 | drop their arguments. */ | |
51 | mov %g0, %fp | |
52 | sub %sp, 6*4, %sp | |
53 | ||
f41c8091 UD |
54 | /* Extract the arguments and environment as encoded on the stack. The |
55 | argument info starts after one register window (16 words) past the SP. */ | |
a5540016 RH |
56 | ld [%sp+22*4], %o1 |
57 | add %sp, 23*4, %o2 | |
58 | ||
59 | /* Load the addresses of the user entry points. */ | |
3d2b3019 DM |
60 | #ifndef SHARED |
61 | sethi %hi(main), %o0 | |
62 | sethi %hi(__libc_csu_init), %o3 | |
63 | sethi %hi(__libc_csu_fini), %o4 | |
64 | or %o0, %lo(main), %o0 | |
65 | or %o3, %lo(__libc_csu_init), %o3 | |
66 | or %o4, %lo(__libc_csu_fini), %o4 | |
67 | #else | |
3d2b3019 DM |
68 | sethi %gdop_hix22(main), %o0 |
69 | sethi %gdop_hix22(__libc_csu_init), %o3 | |
70 | sethi %gdop_hix22(__libc_csu_fini), %o4 | |
71 | xor %o0, %gdop_lox10(main), %o0 | |
72 | xor %o3, %gdop_lox10(__libc_csu_init), %o3 | |
73 | xor %o4, %gdop_lox10(__libc_csu_fini), %o4 | |
74 | ld [%l7 + %o0], %o0, %gdop(main) | |
75 | ld [%l7 + %o3], %o3, %gdop(__libc_csu_init) | |
76 | ld [%l7 + %o4], %o4, %gdop(__libc_csu_fini) | |
4c595adb | 77 | #endif |
a5540016 RH |
78 | |
79 | /* When starting a binary via the dynamic linker, %g1 contains the | |
80 | address of the shared library termination function, which will be | |
81 | registered with atexit(). If we are statically linked, this will | |
82 | be NULL. */ | |
83 | mov %g1, %o5 | |
84 | ||
85 | /* Let libc do the rest of the initialization, and call main. */ | |
86 | call __libc_start_main | |
f41c8091 UD |
87 | nop |
88 | ||
89 | /* Die very horribly if exit returns. */ | |
90 | unimp | |
91 | ||
a5540016 | 92 | .size _start, .-_start |
87f37b48 RM |
93 | |
94 | /* Define a symbol for the first piece of initialized data. */ | |
95 | .data | |
96 | .globl __data_start | |
97 | __data_start: | |
e42e88ab | 98 | .long 0 |
87f37b48 | 99 | weak_alias (__data_start, data_start) |