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
3034198Sjdp#include <stdlib.h>
3199354Smarkm
3293399Smarkm#include "libc_private.h"
3367811Sobrien#include "crtbrand.c"
34232832Skib#include "ignore_init.c"
3534198Sjdp
3634198Sjdptypedef void (*fptr)(void);
3734198Sjdp
3838928Sjdp#ifdef GCRT
3938928Sjdpextern void _mcleanup(void);
4038928Sjdpextern void monstartup(void *, void *);
4138928Sjdpextern int eprol;
4238928Sjdpextern int etext;
4338928Sjdp#endif
4438928Sjdp
45204756Suqsvoid _start(char **, void (*)(void));
46204756Suqs
47100167Smarkm/* The entry function. */
4834198Sjdpvoid
49114319Speter_start(char **ap, void (*cleanup)(void))
5034198Sjdp{
5199354Smarkm	int argc;
5299354Smarkm	char **argv;
5399354Smarkm	char **env;
5434198Sjdp
55114319Speter	argc = *(long *)(void *)ap;
56114319Speter	argv = ap + 1;
57114319Speter	env = ap + 2 + argc;
58245133Skib	handle_argv(argc, argv, env);
5934198Sjdp
6099354Smarkm	if (&_DYNAMIC != NULL)
61100167Smarkm		atexit(cleanup);
62133754Sdfr	else
63133754Sdfr		_init_tls();
6434198Sjdp
6538928Sjdp#ifdef GCRT
6699354Smarkm	atexit(_mcleanup);
6799354Smarkm	monstartup(&eprol, &etext);
68151072Sbde__asm__("eprol:");
6938928Sjdp#endif
70232832Skib
71232832Skib	handle_static_init(argc, argv, env);
72232832Skib	exit(main(argc, argv, env));
7334198Sjdp}
74