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.
25200038Skib *
26200038Skib * $FreeBSD$
2734198Sjdp */
2834198Sjdp
29216338Sdim#include <sys/cdefs.h>
30216338Sdim__FBSDID("$FreeBSD$");
31216338Sdim
32100167Smarkm#ifndef lint
3334198Sjdp#ifndef __GNUC__
3434198Sjdp#error "GCC is needed to compile this file"
3534198Sjdp#endif
36100167Smarkm#endif /* lint */
3734198Sjdp
3834198Sjdp#include <stdlib.h>
3999354Smarkm
4093399Smarkm#include "libc_private.h"
4167811Sobrien#include "crtbrand.c"
42232832Skib#include "ignore_init.c"
4334198Sjdp
4434198Sjdptypedef void (*fptr)(void);
4534198Sjdp
46100167Smarkmextern void _start(char *, ...);
4734198Sjdp
4838928Sjdp#ifdef GCRT
4938928Sjdpextern void _mcleanup(void);
5038928Sjdpextern void monstartup(void *, void *);
5138928Sjdpextern int eprol;
5238928Sjdpextern int etext;
5338928Sjdp#endif
5438928Sjdp
55200038Skibvoid _start1(fptr, int, char *[]) __dead2;
56100167Smarkm
57200038Skib/* The entry function, C part. */
5834198Sjdpvoid
59200038Skib_start1(fptr cleanup, int argc, char *argv[])
6034198Sjdp{
6199354Smarkm	char **env;
6234198Sjdp
6399354Smarkm	env = argv + argc + 1;
64245133Skib	handle_argv(argc, argv, env);
6599354Smarkm	if (&_DYNAMIC != NULL)
66100167Smarkm		atexit(cleanup);
67133754Sdfr	else
68133754Sdfr		_init_tls();
6934198Sjdp
7038928Sjdp#ifdef GCRT
7199354Smarkm	atexit(_mcleanup);
7299354Smarkm	monstartup(&eprol, &etext);
73151072Sbde__asm__("eprol:");
7438928Sjdp#endif
75232832Skib
76232832Skib	handle_static_init(argc, argv, env);
77232832Skib	exit(main(argc, argv, env));
7834198Sjdp}
7938928Sjdp
80200038Skib__asm(".hidden	_start1");
81