Commit | Line | Data |
---|---|---|
b8098ef8 | 1 | /* C code startup routine. |
429ab54e | 2 | Copyright (C) 1985, 1986, 1992, 2001, 2002, 2003, 2004, |
114f9c96 | 3 | 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
b8098ef8 DL |
4 | |
5 | This file is part of GNU Emacs. | |
6 | ||
9ec0b715 | 7 | GNU Emacs is free software: you can redistribute it and/or modify |
b8098ef8 | 8 | it under the terms of the GNU General Public License as published by |
9ec0b715 GM |
9 | the Free Software Foundation, either version 3 of the License, or |
10 | (at your option) any later version. | |
b8098ef8 DL |
11 | |
12 | GNU Emacs is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
9ec0b715 | 18 | along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
b8098ef8 DL |
19 | |
20 | ||
21 | /* The standard Vax 4.2 Unix crt0.c cannot be used for Emacs | |
22 | because it makes `environ' an initialized variable. | |
23 | It is easiest to have a special crt0.c on all machines | |
24 | though I don't know whether other machines actually need it. */ | |
25 | ||
26 | /* On the vax and 68000, in BSD4.2 and USG5.2, | |
27 | this is the data format on startup: | |
28 | (vax) ap and fp are unpredictable as far as I know; don't use them. | |
29 | sp -> word containing argc | |
30 | word pointing to first arg string | |
31 | [word pointing to next arg string]... 0 or more times | |
32 | 0 | |
33 | Optionally: | |
34 | [word pointing to environment variable]... 1 or more times | |
35 | ... | |
36 | 0 | |
37 | And always: | |
38 | first arg string | |
39 | [next arg string]... 0 or more times | |
40 | */ | |
41 | ||
b8098ef8 DL |
42 | #ifdef emacs |
43 | #include <config.h> | |
44 | #endif | |
45 | ||
46 | /* ******** WARNING ******** | |
47 | Do not insert any data definitions before data_start! | |
48 | Since this is the first file linked, the address of the following | |
49 | variable should correspond to the start of initialized data space. | |
50 | On some systems this is a constant that is independent of the text | |
51 | size for shared executables. On others, it is a function of the | |
52 | text size. In short, this seems to be the most portable way to | |
53 | discover the start of initialized data space dynamically at runtime, | |
54 | for either shared or unshared executables, on either swapping or | |
55 | virtual systems. It only requires that the linker allocate objects | |
56 | in the order encountered, a reasonable model for most Unix systems. | |
57 | Similarly, note that the address of _start() should be the start | |
58 | of text space. Fred Fish, UniSoft Systems Inc. */ | |
59 | ||
60 | int data_start = 0; | |
61 | ||
b8098ef8 | 62 | char **environ; |
b8098ef8 | 63 | |
971de7fb | 64 | static start1 (int bogus_fp, int argc, char *xargv); |
b8098ef8 DL |
65 | |
66 | /* Define symbol "start": here; some systems want that symbol. */ | |
b8098ef8 DL |
67 | asm(" .text "); |
68 | asm(" .globl start "); | |
69 | asm(" start: "); | |
b8098ef8 | 70 | |
971de7fb | 71 | _start (void) |
b8098ef8 DL |
72 | { |
73 | /* On vax, nothing is pushed here */ | |
b8098ef8 DL |
74 | start1 (); |
75 | } | |
76 | ||
b8098ef8 | 77 | static |
971de7fb | 78 | start1 (int bogus_fp, int argc, char *xargv) |
b8098ef8 DL |
79 | { |
80 | register char **argv = &xargv; | |
81 | environ = argv + argc + 1; | |
82 | ||
83 | if ((char *)environ == xargv) | |
84 | environ--; | |
85 | exit (main (argc, argv, environ)); | |
86 | ||
87 | /* Refer to `start1' so GCC will not think it is never called | |
88 | and optimize it out. */ | |
89 | (void) &start1; | |
90 | } | |
ab5796a9 MB |
91 | |
92 | /* arch-tag: 4025c2fb-d6b1-4d29-b1b6-8100b6bd1e74 | |
93 | (do not change this comment) */ |