crt1.c revision 99354
1207618Srdivacky/*-
2193323Sed * Copyright 1996-1998 John D. Polstra.
3193323Sed * All rights reserved.
4193323Sed *
5193323Sed * Redistribution and use in source and binary forms, with or without
6193323Sed * modification, are permitted provided that the following conditions
7193323Sed * are met:
8193323Sed * 1. Redistributions of source code must retain the above copyright
9193323Sed *    notice, this list of conditions and the following disclaimer.
10193323Sed * 2. Redistributions in binary form must reproduce the above copyright
11193323Sed *    notice, this list of conditions and the following disclaimer in the
12193323Sed *    documentation and/or other materials provided with the distribution.
13193323Sed *
14193323Sed * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15193323Sed * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16193323Sed * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17193323Sed * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18193323Sed * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19193323Sed * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20193323Sed * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21193323Sed * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22193323Sed * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23193323Sed * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24193323Sed */
25193323Sed
26193323Sed#ifndef __GNUC__
27193323Sed#error "GCC is needed to compile this file"
28193323Sed#endif
29193323Sed
30193323Sed#include <stddef.h>
31193323Sed#include <stdlib.h>
32193323Sed
33193323Sed#include "libc_private.h"
34193323Sed#include "crtbrand.c"
35193323Sed
36193323Sedtypedef void (*fptr)(void);
37193323Sed
38193323Sedextern void _fini(void);
39193323Sedextern void _init(void);
40193323Sedextern int main(int, char **, char **);
41193323Sed
42234353Sdim#ifdef GCRT
43249423Sdimextern void _mcleanup(void);
44263508Sdimextern void monstartup(void *, void *);
45249423Sdimextern int eprol;
46249423Sdimextern int etext;
47223017Sdim#endif
48210299Sed
49193323Sedextern int _DYNAMIC;
50193323Sed#pragma weak _DYNAMIC
51193323Sed
52249423Sdim#ifdef __i386__
53249423Sdim#define get_rtld_cleanup()				\
54249423Sdim	({ fptr __value;				\
55249423Sdim	    __asm__("movl %%edx,%0" : "=rm"(__value));	\
56249423Sdim	    __value; })
57249423Sdim#else
58249423Sdim#error "This file only supports the i386 architecture"
59249423Sdim#endif
60249423Sdim
61193323Sedchar **environ;
62239462Sdimconst char *__progname = "";
63193323Sed
64193323Sedvoid
65193323Sed_start(char *arguments, ...)
66193323Sed{
67234353Sdim	fptr rtld_cleanup;
68234353Sdim	int argc;
69234353Sdim	char **argv;
70234353Sdim	char **env;
71234353Sdim	const char *s;
72234353Sdim
73210299Sed	rtld_cleanup = get_rtld_cleanup();
74210299Sed	argv = &arguments;
75210299Sed	argc = * (int *) (argv - 1);
76210299Sed	env = argv + argc + 1;
77210299Sed	environ = env;
78210299Sed	if (argc > 0 && argv[0] != NULL) {
79253042Sdim		__progname = argv[0];
80253042Sdim		for (s = __progname; *s != '\0'; s++)
81253042Sdim			if (*s == '/')
82226633Sdim				__progname = s + 1;
83253042Sdim	}
84253042Sdim
85226633Sdim	if (&_DYNAMIC != NULL)
86210299Sed		atexit(rtld_cleanup);
87210299Sed
88249423Sdim#ifdef GCRT
89249423Sdim	atexit(_mcleanup);
90249423Sdim#endif
91249423Sdim	atexit(_fini);
92249423Sdim#ifdef GCRT
93263508Sdim	monstartup(&eprol, &etext);
94249423Sdim#endif
95249423Sdim	_init();
96249423Sdim	exit( main(argc, argv, env) );
97263508Sdim}
98249423Sdim
99249423Sdim#ifdef GCRT
100263508Sdim__asm__(".text");
101263508Sdim__asm__("eprol:");
102263508Sdim__asm__(".previous");
103249423Sdim#endif
104249423Sdim
105249423Sdim__asm__(".ident\t\"$FreeBSD: head/lib/csu/amd64/crt1.c 99354 2002-07-03 14:42:39Z markm $\"");
106249423Sdim