crt1.c revision 99354
1207618Srdivacky/*- 2193323Sed * Copyright 1996-1998 John D. Polstra. 3193323Sed * All rights reserved. 4193323Sed * 5193323Sed * Redistribution and use in source and binary forms, with or without 6193323Sed * modification, are permitted provided that the following conditions 7193323Sed * are met: 8193323Sed * 1. Redistributions of source code must retain the above copyright 9193323Sed * notice, this list of conditions and the following disclaimer. 10193323Sed * 2. Redistributions in binary form must reproduce the above copyright 11193323Sed * notice, this list of conditions and the following disclaimer in the 12193323Sed * documentation and/or other materials provided with the distribution. 13193323Sed * 14193323Sed * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15193323Sed * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16193323Sed * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17193323Sed * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18193323Sed * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19193323Sed * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20193323Sed * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21193323Sed * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22193323Sed * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23193323Sed * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24193323Sed */ 25193323Sed 26193323Sed#ifndef __GNUC__ 27193323Sed#error "GCC is needed to compile this file" 28193323Sed#endif 29193323Sed 30193323Sed#include <stddef.h> 31193323Sed#include <stdlib.h> 32193323Sed 33193323Sed#include "libc_private.h" 34193323Sed#include "crtbrand.c" 35193323Sed 36193323Sedtypedef void (*fptr)(void); 37193323Sed 38193323Sedextern void _fini(void); 39193323Sedextern void _init(void); 40193323Sedextern int main(int, char **, char **); 41193323Sed 42234353Sdim#ifdef GCRT 43249423Sdimextern void _mcleanup(void); 44263508Sdimextern void monstartup(void *, void *); 45249423Sdimextern int eprol; 46249423Sdimextern int etext; 47223017Sdim#endif 48210299Sed 49193323Sedextern int _DYNAMIC; 50193323Sed#pragma weak _DYNAMIC 51193323Sed 52249423Sdim#ifdef __i386__ 53249423Sdim#define get_rtld_cleanup() \ 54249423Sdim ({ fptr __value; \ 55249423Sdim __asm__("movl %%edx,%0" : "=rm"(__value)); \ 56249423Sdim __value; }) 57249423Sdim#else 58249423Sdim#error "This file only supports the i386 architecture" 59249423Sdim#endif 60249423Sdim 61193323Sedchar **environ; 62239462Sdimconst char *__progname = ""; 63193323Sed 64193323Sedvoid 65193323Sed_start(char *arguments, ...) 66193323Sed{ 67234353Sdim fptr rtld_cleanup; 68234353Sdim int argc; 69234353Sdim char **argv; 70234353Sdim char **env; 71234353Sdim const char *s; 72234353Sdim 73210299Sed rtld_cleanup = get_rtld_cleanup(); 74210299Sed argv = &arguments; 75210299Sed argc = * (int *) (argv - 1); 76210299Sed env = argv + argc + 1; 77210299Sed environ = env; 78210299Sed if (argc > 0 && argv[0] != NULL) { 79253042Sdim __progname = argv[0]; 80253042Sdim for (s = __progname; *s != '\0'; s++) 81253042Sdim if (*s == '/') 82226633Sdim __progname = s + 1; 83253042Sdim } 84253042Sdim 85226633Sdim if (&_DYNAMIC != NULL) 86210299Sed atexit(rtld_cleanup); 87210299Sed 88249423Sdim#ifdef GCRT 89249423Sdim atexit(_mcleanup); 90249423Sdim#endif 91249423Sdim atexit(_fini); 92249423Sdim#ifdef GCRT 93263508Sdim monstartup(&eprol, &etext); 94249423Sdim#endif 95249423Sdim _init(); 96249423Sdim exit( main(argc, argv, env) ); 97263508Sdim} 98249423Sdim 99249423Sdim#ifdef GCRT 100263508Sdim__asm__(".text"); 101263508Sdim__asm__("eprol:"); 102263508Sdim__asm__(".previous"); 103249423Sdim#endif 104249423Sdim 105249423Sdim__asm__(".ident\t\"$FreeBSD: head/lib/csu/amd64/crt1.c 99354 2002-07-03 14:42:39Z markm $\""); 106249423Sdim