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