void attribute_hidden _init (int argc, char **argv, char **envp) { #endif #ifdef USE_NONOPTION_FLAGS extern void __getopt_clean_environment (char **); #endif __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up; /* Make sure we don't initialize twice. */ if (!__libc_multiple_libcs) { /* Set the FPU control word to the proper default value if the kernel would use a different value. (In a static program we don't have this information.) */ #ifdef SHARED if (__fpu_control != GLRO(dl_fpu_control)) #endif __setfpucw (__fpu_control); } /* Save the command-line arguments. */ __libc_argc = argc; __libc_argv = argv; __environ = envp; #ifndef SHARED // !BAM // __libc_init_secure (); /* First the initialization which normally would be done by the dynamic linker. */ // !BAM // _dl_non_dynamic_init (); #endif #ifdef VDSO_SETUP VDSO_SETUP (); #endif __init_misc (argc, argv, envp); #ifdef USE_NONOPTION_FLAGS /* This is a hack to make the special getopt in GNU libc working. */ __getopt_clean_environment (envp); #endif /* Initialize ctype data. */ __ctype_init (); #if defined SHARED && !defined NO_CTORS_DTORS_SECTIONS __libc_global_ctors (); #endif }
static void init1 (int argc, char *arg0, ...) { char **argv = &arg0; char **envp = &argv[argc + 1]; struct hurd_startup_data *d; __libc_argc = argc; __libc_argv = argv; __environ = envp; while (*envp) ++envp; d = (void *) ++envp; /* If we are the bootstrap task started by the kernel, then after the environment pointers there is no Hurd data block; the argument strings start there. */ if ((void *) d != argv[0]) { _hurd_init_dtable = d->dtable; _hurd_init_dtablesize = d->dtablesize; { /* Check if the stack we are now on is different from the one described by _hurd_stack_{base,size}. */ char dummy; const vm_address_t newsp = (vm_address_t) &dummy; if (d->stack_size != 0 && (newsp < d->stack_base || newsp - d->stack_base > d->stack_size)) /* The new stack pointer does not intersect with the stack the exec server set up for us, so free that stack. */ __vm_deallocate (__mach_task_self (), d->stack_base, d->stack_size); } } if (__hurd_threadvar_stack_mask == 0) { /* We are not using cthreads, so we will have just a single allocated area for the per-thread variables of the main user thread. */ unsigned long int i; __hurd_threadvar_stack_offset = (unsigned long int) malloc (__hurd_threadvar_max * sizeof (unsigned long int)); if (__hurd_threadvar_stack_offset == 0) __libc_fatal ("Can't allocate single-threaded per-thread variables."); for (i = 0; i < __hurd_threadvar_max; ++i) ((unsigned long int *) __hurd_threadvar_stack_offset)[i] = 0; } if ((void *) d != argv[0] && (d->portarray || d->intarray)) /* Initialize library data structures, start signal processing, etc. */ _hurd_init (d->flags, argv, d->portarray, d->portarraysize, d->intarray, d->intarraysize); __libc_init (argc, argv, __environ); #ifdef USE_NONOPTION_FLAGS /* This is a hack to make the special getopt in GNU libc working. */ __getopt_clean_environment (envp); #endif #ifdef SHARED __libc_global_ctors (); #endif (void) &init1; }