1/*- 2 * SPDX-License-Identifier: BSD-4-Clause 3 * 4 * Copyright 1996-1998 John D. Polstra. 5 * All rights reserved. 6 * Copyright (c) 1995 Christopher G. Demetriou 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by Christopher G. Demetriou 20 * for the NetBSD Project. 21 * 4. The name of the author may not be used to endorse or promote products 22 * derived from this software without specific prior written permission 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 26 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 29 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 33 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 * 35 * $FreeBSD$ 36 */ 37 38#include <sys/cdefs.h> 39__FBSDID("$FreeBSD$"); 40 41#include <stdlib.h> 42#include "libc_private.h" 43#include "ignore_init.c" 44 45struct Struct_Obj_Entry; 46struct ps_strings; 47 48#ifdef GCRT 49extern void _mcleanup(void); 50extern void monstartup(void *, void *); 51extern int eprol; 52extern int etext; 53#endif 54 55void __start(char **, void (*)(void), struct Struct_Obj_Entry *, struct ps_strings *); 56 57/* The entry function. */ 58void 59__start(char **ap, 60 void (*cleanup)(void), /* from shared loader */ 61 struct Struct_Obj_Entry *obj __unused, /* from shared loader */ 62 struct ps_strings *ps_strings __unused) 63{ 64 int argc; 65 char **argv; 66 char **env; 67 68 argc = * (long *) ap; 69 argv = ap + 1; 70 env = ap + 2 + argc; 71 handle_argv(argc, argv, env); 72 73 if (&_DYNAMIC != NULL) 74 atexit(cleanup); 75 else 76 _init_tls(); 77 78#ifdef GCRT 79 atexit(_mcleanup); 80 monstartup(&eprol, &etext); 81#endif 82 83 handle_static_init(argc, argv, env); 84 exit(main(argc, argv, env)); 85} 86 87#ifdef GCRT 88__asm__(".text"); 89__asm__("eprol:"); 90__asm__(".previous"); 91#endif 92