1109905Smarkm/* LINTLIBRARY */
234198Sjdp/*-
334198Sjdp * Copyright 1996-1998 John D. Polstra.
434198Sjdp * All rights reserved.
534198Sjdp *
634198Sjdp * Redistribution and use in source and binary forms, with or without
734198Sjdp * modification, are permitted provided that the following conditions
834198Sjdp * are met:
934198Sjdp * 1. Redistributions of source code must retain the above copyright
1034198Sjdp *    notice, this list of conditions and the following disclaimer.
1134198Sjdp * 2. Redistributions in binary form must reproduce the above copyright
1234198Sjdp *    notice, this list of conditions and the following disclaimer in the
1334198Sjdp *    documentation and/or other materials provided with the distribution.
1434198Sjdp *
1534198Sjdp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1634198Sjdp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1734198Sjdp * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1834198Sjdp * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1934198Sjdp * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2034198Sjdp * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2134198Sjdp * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2234198Sjdp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2334198Sjdp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2434198Sjdp * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2534198Sjdp */
2634198Sjdp
27216338Sdim#include <sys/cdefs.h>
28216338Sdim__FBSDID("$FreeBSD$");
29216338Sdim
30100167Smarkm#ifndef lint
3134198Sjdp#ifndef __GNUC__
3234198Sjdp#error "GCC is needed to compile this file"
3334198Sjdp#endif
34100167Smarkm#endif /* lint */
3534198Sjdp
3634198Sjdp#include <stdlib.h>
3799354Smarkm
3893399Smarkm#include "libc_private.h"
3967811Sobrien#include "crtbrand.c"
40232832Skib#include "ignore_init.c"
4134198Sjdp
4234198Sjdptypedef void (*fptr)(void);
4334198Sjdp
4438928Sjdp#ifdef GCRT
4538928Sjdpextern void _mcleanup(void);
4638928Sjdpextern void monstartup(void *, void *);
4738928Sjdpextern int eprol;
4838928Sjdpextern int etext;
4938928Sjdp#endif
5038928Sjdp
51204756Suqsvoid _start(char **, void (*)(void));
52204756Suqs
53100167Smarkm/* The entry function. */
5434198Sjdpvoid
55114319Speter_start(char **ap, void (*cleanup)(void))
5634198Sjdp{
5799354Smarkm	int argc;
5899354Smarkm	char **argv;
5999354Smarkm	char **env;
6034198Sjdp
61114319Speter	argc = *(long *)(void *)ap;
62114319Speter	argv = ap + 1;
63114319Speter	env = ap + 2 + argc;
64245133Skib	handle_argv(argc, argv, env);
6534198Sjdp
6699354Smarkm	if (&_DYNAMIC != NULL)
67100167Smarkm		atexit(cleanup);
68133754Sdfr	else
69133754Sdfr		_init_tls();
7034198Sjdp
7138928Sjdp#ifdef GCRT
7299354Smarkm	atexit(_mcleanup);
7399354Smarkm	monstartup(&eprol, &etext);
74151072Sbde__asm__("eprol:");
7538928Sjdp#endif
76232832Skib
77232832Skib	handle_static_init(argc, argv, env);
78232832Skib	exit(main(argc, argv, env));
7934198Sjdp}
80