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"
4234198Sjdp
43100167Smarkmextern int _DYNAMIC;
44100167Smarkm#pragma weak _DYNAMIC
45100167Smarkm
4634198Sjdptypedef void (*fptr)(void);
4734198Sjdp
4834198Sjdpextern void _fini(void);
4934198Sjdpextern void _init(void);
5034198Sjdpextern int main(int, char **, char **);
51100167Smarkmextern void _start(char *, ...);
5234198Sjdp
5338928Sjdp#ifdef GCRT
5438928Sjdpextern void _mcleanup(void);
5538928Sjdpextern void monstartup(void *, void *);
5638928Sjdpextern int eprol;
5738928Sjdpextern int etext;
5838928Sjdp#endif
5938928Sjdp
60100167Smarkmchar **environ;
61100167Smarkmconst char *__progname = "";
6234198Sjdp
63200038Skibvoid _start1(fptr, int, char *[]) __dead2;
64100167Smarkm
65200038Skib/* The entry function, C part. */
6634198Sjdpvoid
67200038Skib_start1(fptr cleanup, int argc, char *argv[])
6834198Sjdp{
6999354Smarkm	char **env;
7099354Smarkm	const char *s;
7134198Sjdp
7299354Smarkm	env = argv + argc + 1;
73245777Skib	if (environ == NULL)
74245777Skib		environ = env;
7599354Smarkm	if (argc > 0 && argv[0] != NULL) {
7699354Smarkm		__progname = argv[0];
7799354Smarkm		for (s = __progname; *s != '\0'; s++)
7899354Smarkm			if (*s == '/')
7999354Smarkm				__progname = s + 1;
8099354Smarkm	}
8134198Sjdp
8299354Smarkm	if (&_DYNAMIC != NULL)
83100167Smarkm		atexit(cleanup);
84133754Sdfr	else
85133754Sdfr		_init_tls();
8634198Sjdp
8738928Sjdp#ifdef GCRT
8899354Smarkm	atexit(_mcleanup);
8938928Sjdp#endif
9099354Smarkm	atexit(_fini);
9138928Sjdp#ifdef GCRT
9299354Smarkm	monstartup(&eprol, &etext);
93151072Sbde__asm__("eprol:");
9438928Sjdp#endif
9599354Smarkm	_init();
9699354Smarkm	exit( main(argc, argv, env) );
9734198Sjdp}
9838928Sjdp
99200038Skib__asm(".hidden	_start1");
100