1 ! crt1.s for Solaris
2, x86
3 ! Copyright
(C
) 1993, 1998 Free Software Foundation
, Inc.
4 ! Written By Fred Fish
, Nov
1992
6 ! This file is free software
; you can redistribute it and/or modify it
7 ! under the terms of the GNU General
Public License as published by the
8 ! Free Software Foundation
; either version 2, or (at your option) any
11 ! In addition to the permissions
in the GNU General
Public License
, the
12 ! Free Software Foundation gives you unlimited permission to link the
13 ! compiled version of
this file with other programs
, and to distribute
14 ! those programs without any restriction coming from the use of
this
15 ! file.
(The General
Public License restrictions do apply
in other
16 ! respects
; for example, they cover modification of the file, and
17 ! distribution when
not linked
into another program.
)
19 ! This file is distributed
in the hope that it will be useful
, but
20 ! WITHOUT ANY WARRANTY
; without even the implied warranty of
21 ! MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 ! General
Public License for more details.
24 ! You should have received a copy of the GNU General
Public License
25 ! along with
this program
; see the file COPYING. If not, write to
26 ! the Free Software Foundation
, 59 Temple Place
- Suite
330,
27 ! Boston
, MA
02111-1307, USA.
29 ! As a special exception
, if you link
this library with files
30 ! compiled with GCC to produce an executable
, this does
not cause
31 ! the resulting executable to be covered by the GNU General
Public License.
32 ! This exception does
not however invalidate any other reasons why
33 ! the executable file might be covered by the GNU General
Public License.
36 ! This file takes control of the process from the kernel
, as specified
37 ! in section 3 of the System V Application Binary Interface
, Intel386
38 ! Processor Supplement. It has been constructed from information obtained
39 ! from the ABI
, information obtained from single stepping existing
40 ! Solaris executables through their startup code with gdb
, and from
41 ! information obtained by single stepping executables on other i386 SVR4
42 ! implementations.
This file is the first thing linked
into any executable.
50 ! Start creating the initial frame by pushing a NULL value for the return
51 ! address of the initial frame
, and mark the
end of the stack frame chain
52 ! (the innermost stack frame
) with a NULL value
, per
page 3-32 of the ABI.
53 ! Initialize the first stack frame pointer
in %ebp (the contents of which
54 ! are unspecified at process initialization
).
62 ! As specified per
page 3-32 of the ABI
, %edx contains a function
63 ! pointer that should be registered with atexit
(), for proper
64 ! shared object termination. Just
push it onto the stack for now
65 ! to preserve it. We want to register _cleanup
() first.
69 ! Check to see if there is an _cleanup
() function linked
in, and if
70 ! so
, register it with atexit
() as the last thing to be run by
81 ! Now check to see if we have an _DYNAMIC table
, and if so then
82 ! we need to register the function pointer previously
in %edx, but
83 ! now conveniently saved on the stack as the argument to pass to
92 ! Register _fini
() with atexit
(). We will take care of calling _init
()
98 ! Compute the address of the environment vector on the stack
and load
99 ! it
into the
global variable _environ. Currently argc is at
8 off
100 ! the frame pointer. Fetch the argument count
into %eax, scale by the
101 ! size of each arg
(4 bytes
) and compute the address of the environment
102 ! vector which is
16 bytes
(the two zero words we pushed
, plus argc
,
103 ! plus the null
word terminating the arg vector
) further up the stack
,
104 ! off the frame pointer
(whew
!).
107 leal
16(%ebp,%eax,4),%edx
110 ! Push the environment vector pointer
, the argument vector pointer
,
111 ! and the argument count on to the stack to set up the arguments
112 ! for _init
(), _fpstart
(), and main
(). Note that the environment
113 ! vector pointer
and the arg count were previously loaded
into
114 ! %edx and %eax respectively. The only new value we need to compute
115 ! is the argument vector pointer
, which is at a fixed address off
116 ! the initial frame pointer.
119 ! Make sure the stack is properly aligned.
121 andl
$0xfffffff0
,%esp
129 ! Call _init
(argc
, argv
, environ
), _fpstart
(argc
, argv
, environ
), and
130 ! main
(argc
, argv
, environ
).
136 ! Pop the argc
, argv
, and environ arguments off the stack
, push the
137 ! value returned from main
(), and call exit
().
143 ! An inline equivalent of _exit
, as specified
in Figure
3-26 of the ABI.
149 ! If all else fails
, just try a halt
!
152 .
type _start
,@function
153 .
size _start
,.
-_start
155 ! A dummy profiling support routine for non
-profiling executables
,
156 ! in case we link
in some objects that have been compiled for profiling.
161 .
type _mcount
,@function
162 .
size _mcount
,.
-_mcount