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