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 "crtbrand.c" 44#include "ignore_init.c" 45 46struct Struct_Obj_Entry; 47struct ps_strings; 48 49#ifdef GCRT 50extern void _mcleanup(void); 51extern void monstartup(void *, void *); 52extern int eprol; 53extern int etext; 54#endif 55 56void __start(char **, void (*)(void), struct Struct_Obj_Entry *, struct ps_strings *); 57 58/* The entry function. */ 59void 60__start(char **ap, 61 void (*cleanup)(void), /* from shared loader */ 62 struct Struct_Obj_Entry *obj __unused, /* from shared loader */ 63 struct ps_strings *ps_strings __unused) 64{ 65 int argc; 66 char **argv; 67 char **env; 68 69 argc = * (long *) ap; 70 argv = ap + 1; 71 env = ap + 2 + argc; 72 handle_argv(argc, argv, env); 73 74 if (&_DYNAMIC != NULL) 75 atexit(cleanup); 76 else 77 _init_tls(); 78 79#ifdef GCRT 80 atexit(_mcleanup); 81 monstartup(&eprol, &etext); 82#endif 83 84 handle_static_init(argc, argv, env); 85 exit(main(argc, argv, env)); 86} 87 88#ifdef GCRT 89__asm__(".text"); 90__asm__("eprol:"); 91__asm__(".previous"); 92#endif 93