crt1.c revision 133754
1218822Sdim/* LINTLIBRARY */ 2218822Sdim/*- 389857Sobrien * Copyright 1996-1998 John D. Polstra. 4218822Sdim * All rights reserved. 5218822Sdim * 689857Sobrien * Redistribution and use in source and binary forms, with or without 789857Sobrien * modification, are permitted provided that the following conditions 889857Sobrien * are met: 989857Sobrien * 1. Redistributions of source code must retain the above copyright 1089857Sobrien * notice, this list of conditions and the following disclaimer. 1189857Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1289857Sobrien * notice, this list of conditions and the following disclaimer in the 1389857Sobrien * documentation and/or other materials provided with the distribution. 1489857Sobrien * 15218822Sdim * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1689857Sobrien * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1789857Sobrien * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1889857Sobrien * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1989857Sobrien * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2089857Sobrien * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2189857Sobrien * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2289857Sobrien * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23218822Sdim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2489857Sobrien * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25218822Sdim */ 26218822Sdim 27218822Sdim#ifndef lint 28218822Sdim#ifndef __GNUC__ 29218822Sdim#error "GCC is needed to compile this file" 3089857Sobrien#endif 3189857Sobrien#endif /* lint */ 3289857Sobrien 3389857Sobrien#include <stdlib.h> 3489857Sobrien 3589857Sobrien#include "libc_private.h" 3689857Sobrien#include "crtbrand.c" 3789857Sobrien 3889857Sobrienextern int _DYNAMIC; 39218822Sdim#pragma weak _DYNAMIC 40218822Sdim 41218822Sdimtypedef void (*fptr)(void); 42218822Sdim 43218822Sdimextern void _fini(void); 44218822Sdimextern void _init(void); 45218822Sdimextern int main(int, char **, char **); 46218822Sdimextern void _start(char **, void (*)(void)); 47218822Sdim 48218822Sdim#ifdef GCRT 49218822Sdimextern void _mcleanup(void); 50218822Sdimextern void monstartup(void *, void *); 51218822Sdimextern int eprol; 52218822Sdimextern int etext; 53218822Sdim#endif 54218822Sdim 55218822Sdimchar **environ; 56218822Sdimconst char *__progname = ""; 57218822Sdim 58218822Sdim/* The entry function. */ 59218822Sdimvoid 60218822Sdim_start(char **ap, void (*cleanup)(void)) 61218822Sdim{ 62218822Sdim int argc; 63218822Sdim char **argv; 64218822Sdim char **env; 65218822Sdim const char *s; 66218822Sdim 67218822Sdim argc = *(long *)(void *)ap; 68218822Sdim argv = ap + 1; 69218822Sdim env = ap + 2 + argc; 70218822Sdim environ = env; 71218822Sdim if (argc > 0 && argv[0] != NULL) { 72218822Sdim __progname = argv[0]; 73218822Sdim for (s = __progname; *s != '\0'; s++) 74218822Sdim if (*s == '/') 75218822Sdim __progname = s + 1; 76218822Sdim } 77218822Sdim 78218822Sdim if (&_DYNAMIC != NULL) 79218822Sdim atexit(cleanup); 80218822Sdim else 81218822Sdim _init_tls(); 82218822Sdim 83218822Sdim#ifdef GCRT 84218822Sdim atexit(_mcleanup); 8589857Sobrien#endif 86218822Sdim atexit(_fini); 87218822Sdim#ifdef GCRT 88218822Sdim monstartup(&eprol, &etext); 89218822Sdim#endif 9089857Sobrien _init(); 9189857Sobrien exit( main(argc, argv, env) ); 92218822Sdim} 9389857Sobrien 9489857Sobrien#ifdef GCRT 9589857Sobrien__asm__(".text"); 96218822Sdim__asm__("eprol:"); 9789857Sobrien__asm__(".previous"); 9889857Sobrien#endif 9989857Sobrien 10089857Sobrien__asm__(".ident\t\"$FreeBSD: head/lib/csu/amd64/crt1.c 133754 2004-08-15 16:18:52Z dfr $\""); 101218822Sdim