1 ! gcrt1.s for Solaris
2, x86
3 ! Copyright
(C
) 1993 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.
44 ! This is a modified crt1.s by J.W.Hawtin
<oolon
@ankh.
org> 15/8/96,
45 ! to allow program profiling
, by calling monstartup on
entry and _mcleanup
49 .ident
"GNU C gcrt1.s"
53 ! Start creating the initial frame by pushing a NULL value for the return
54 ! address of the initial frame
, and mark the
end of the stack frame chain
55 ! (the innermost stack frame
) with a NULL value
, per
page 3-32 of the ABI.
56 ! Initialize the first stack frame pointer
in %ebp (the contents of which
57 ! are unspecified at process initialization
).
65 ! As specified per
page 3-32 of the ABI
, %edx contains a function
66 ! pointer that should be registered with atexit
(), for proper
67 ! shared object termination. Just
push it onto the stack for now
68 ! to preserve it. We want to register _cleanup
() first.
72 ! Check to see if there is an _cleanup
() function linked
in, and if
73 ! so
, register it with atexit
() as the last thing to be run by
84 ! Now check to see if we have an _DYNAMIC table
, and if so then
85 ! we need to register the function pointer previously
in %edx, but
86 ! now conveniently saved on the stack as the argument to pass to
95 ! Register _fini
() with atexit
(). We will take care of calling _init
()
111 ! Compute the address of the environment vector on the stack
and load
112 ! it
into the
global variable _environ. Currently argc is at
8 off
113 ! the frame pointer. Fetch the argument count
into %eax, scale by the
114 ! size of each arg
(4 bytes
) and compute the address of the environment
115 ! vector which is
16 bytes
(the two zero words we pushed
, plus argc
,
116 ! plus the null
word terminating the arg vector
) further up the stack
,
117 ! off the frame pointer
(whew
!).
120 leal
16(%ebp,%eax,4),%edx
123 ! Push the environment vector pointer
, the argument vector pointer
,
124 ! and the argument count on to the stack to set up the arguments
125 ! for _init
(), _fpstart
(), and main
(). Note that the environment
126 ! vector pointer
and the arg count were previously loaded
into
127 ! %edx and %eax respectively. The only new value we need to compute
128 ! is the argument vector pointer
, which is at a fixed address off
129 ! the initial frame pointer.
132 ! Make sure the stack is properly aligned.
134 andl
$0xfffffff0
,%esp
142 ! Call _init
(argc
, argv
, environ
), _fpstart
(argc
, argv
, environ
), and
143 ! main
(argc
, argv
, environ
).
149 ! Pop the argc
, argv
, and environ arguments off the stack
, push the
150 ! value returned from main
(), and call exit
().
156 ! An inline equivalent of _exit
, as specified
in Figure
3-26 of the ABI.
162 ! If all else fails
, just try a halt
!
165 .
type _start
,@function
166 .
size _start
,.
-_start