crt1.c revision 133754
1218822Sdim/* LINTLIBRARY */
2218822Sdim/*-
389857Sobrien * Copyright 1996-1998 John D. Polstra.
4218822Sdim * All rights reserved.
5218822Sdim *
689857Sobrien * Redistribution and use in source and binary forms, with or without
789857Sobrien * modification, are permitted provided that the following conditions
889857Sobrien * are met:
989857Sobrien * 1. Redistributions of source code must retain the above copyright
1089857Sobrien *    notice, this list of conditions and the following disclaimer.
1189857Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1289857Sobrien *    notice, this list of conditions and the following disclaimer in the
1389857Sobrien *    documentation and/or other materials provided with the distribution.
1489857Sobrien *
15218822Sdim * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1689857Sobrien * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1789857Sobrien * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1889857Sobrien * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1989857Sobrien * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2089857Sobrien * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2189857Sobrien * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2289857Sobrien * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23218822Sdim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2489857Sobrien * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25218822Sdim */
26218822Sdim
27218822Sdim#ifndef lint
28218822Sdim#ifndef __GNUC__
29218822Sdim#error "GCC is needed to compile this file"
3089857Sobrien#endif
3189857Sobrien#endif /* lint */
3289857Sobrien
3389857Sobrien#include <stdlib.h>
3489857Sobrien
3589857Sobrien#include "libc_private.h"
3689857Sobrien#include "crtbrand.c"
3789857Sobrien
3889857Sobrienextern int _DYNAMIC;
39218822Sdim#pragma weak _DYNAMIC
40218822Sdim
41218822Sdimtypedef void (*fptr)(void);
42218822Sdim
43218822Sdimextern void _fini(void);
44218822Sdimextern void _init(void);
45218822Sdimextern int main(int, char **, char **);
46218822Sdimextern void _start(char **, void (*)(void));
47218822Sdim
48218822Sdim#ifdef GCRT
49218822Sdimextern void _mcleanup(void);
50218822Sdimextern void monstartup(void *, void *);
51218822Sdimextern int eprol;
52218822Sdimextern int etext;
53218822Sdim#endif
54218822Sdim
55218822Sdimchar **environ;
56218822Sdimconst char *__progname = "";
57218822Sdim
58218822Sdim/* The entry function. */
59218822Sdimvoid
60218822Sdim_start(char **ap, void (*cleanup)(void))
61218822Sdim{
62218822Sdim	int argc;
63218822Sdim	char **argv;
64218822Sdim	char **env;
65218822Sdim	const char *s;
66218822Sdim
67218822Sdim	argc = *(long *)(void *)ap;
68218822Sdim	argv = ap + 1;
69218822Sdim	env = ap + 2 + argc;
70218822Sdim	environ = env;
71218822Sdim	if (argc > 0 && argv[0] != NULL) {
72218822Sdim		__progname = argv[0];
73218822Sdim		for (s = __progname; *s != '\0'; s++)
74218822Sdim			if (*s == '/')
75218822Sdim				__progname = s + 1;
76218822Sdim	}
77218822Sdim
78218822Sdim	if (&_DYNAMIC != NULL)
79218822Sdim		atexit(cleanup);
80218822Sdim	else
81218822Sdim		_init_tls();
82218822Sdim
83218822Sdim#ifdef GCRT
84218822Sdim	atexit(_mcleanup);
8589857Sobrien#endif
86218822Sdim	atexit(_fini);
87218822Sdim#ifdef GCRT
88218822Sdim	monstartup(&eprol, &etext);
89218822Sdim#endif
9089857Sobrien	_init();
9189857Sobrien	exit( main(argc, argv, env) );
92218822Sdim}
9389857Sobrien
9489857Sobrien#ifdef GCRT
9589857Sobrien__asm__(".text");
96218822Sdim__asm__("eprol:");
9789857Sobrien__asm__(".previous");
9889857Sobrien#endif
9989857Sobrien
10089857Sobrien__asm__(".ident\t\"$FreeBSD: head/lib/csu/amd64/crt1.c 133754 2004-08-15 16:18:52Z dfr $\"");
101218822Sdim