diff options
Diffstat (limited to 'winsup/cygwin/libccrt0.cc')
-rw-r--r-- | winsup/cygwin/libccrt0.cc | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/winsup/cygwin/libccrt0.cc b/winsup/cygwin/libccrt0.cc new file mode 100644 index 0000000..6f7d534 --- /dev/null +++ b/winsup/cygwin/libccrt0.cc @@ -0,0 +1,95 @@ +/* libccrt0.cc: crt0 for libc [newlib calls this one] + + Copyright 1996, 1998, 1999, 2000 Cygnus Solutions. + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +#undef MALLOC_DEBUG + +#include "winsup.h" +#include <reent.h> +#include <stdlib.h> + +typedef int (*MainFunc) (int argc, char *argc[], char **env); + +extern "C" +{ + char **environ; + void cygwin_crt0 (MainFunc); + int cygwin_attach_dll (HMODULE, MainFunc); + int cygwin_attach_noncygwin_dll (HMODULE, MainFunc); + int main (int, char **, char **); + struct _reent *_impure_ptr; + int _fmode; +}; + +static per_process this_proc; + +/* Set up pointers to various pieces so the dll can then use them, + and then jump to the dll. */ + +static void +cygwin_crt0_common (MainFunc f) +{ + /* This is used to record what the initial sp was. The value is needed + when copying the parent's stack to the child during a fork. */ + int onstack; + + /* The version numbers are the main source of compatibility checking. + As a backup to them, we use the size of the per_process struct. */ + this_proc.magic_biscuit = sizeof (per_process); + + /* cygwin.dll version number in effect at the time the app was created. */ + this_proc.dll_major = CYGWIN_VERSION_DLL_MAJOR; + this_proc.dll_minor = CYGWIN_VERSION_DLL_MINOR; + this_proc.api_major = CYGWIN_VERSION_API_MAJOR; + this_proc.api_minor = CYGWIN_VERSION_API_MINOR; + + this_proc.ctors = &__CTOR_LIST__; + this_proc.dtors = &__DTOR_LIST__; + this_proc.envptr = &environ; + this_proc.impure_ptr_ptr = &_impure_ptr; + this_proc.main = f; + this_proc.fmode_ptr = &_fmode; + this_proc.initial_sp = (char *) &onstack; + + /* Remember whatever the user linked his application with - or + point to entries in the dll. */ + this_proc.malloc = &malloc; + this_proc.free = &free; + this_proc.realloc = &realloc; + this_proc.calloc = &calloc; + + /* Setup the module handle so fork can get the path name. */ + this_proc.hmodule = GetModuleHandle (0); + + /* variables for fork */ + this_proc.data_start = &_data_start__; + this_proc.data_end = &_data_end__; + this_proc.bss_start = &_bss_start__; + this_proc.bss_end = &_bss_end__; +} + +/* for main module */ +void +cygwin_crt0 (MainFunc f) +{ + cygwin_crt0_common (f); + + /* Jump into the dll. */ + dll_crt0 (&this_proc); +} + +/* for a loaded dll */ +int +cygwin_attach_dll (HMODULE h, MainFunc f) +{ + cygwin_crt0_common (f); + + /* jump into the dll. */ + return dll_dllcrt0 (h, &this_proc); +} |