1 /* 2 * Copyright 2003-2009, Axel Dörfler, axeld@pinc-software.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7 #include <pthread.h> 8 #include <string.h> 9 10 #include <OS.h> 11 #include <image.h> 12 13 #include <user_runtime.h> 14 15 #include <runtime_loader.h> 16 17 #include <fork.h> 18 #include <libroot_private.h> 19 #include <pthread_private.h> 20 21 22 struct rld_export *__gRuntimeLoader = NULL; 23 // This little bugger is set to something meaningful by the runtime loader 24 // Ugly, eh? 25 26 const void* __gCommPageAddress; 27 28 char *__progname = NULL; 29 int __libc_argc; 30 char **__libc_argv; 31 32 int __gABIVersion; 33 int __gAPIVersion; 34 int32 __gCPUCount; 35 36 char _single_threaded = true; 37 // determines if I/O locking needed; needed for BeOS compatibility 38 39 thread_id __main_thread_id; 40 char **argv_save; 41 // needed for BeOS compatibility - they are set in the startup code 42 // (have a look at the glue/ directory) 43 44 int _data_offset_main_; 45 // this is obviously needed for R4.5 compatiblity 46 47 48 void 49 initialize_before(image_id imageID) 50 { 51 system_info info; 52 char *programPath = __gRuntimeLoader->program_args->args[0]; 53 __gCommPageAddress = __gRuntimeLoader->commpage_address; 54 __gABIVersion = __gRuntimeLoader->abi_version; 55 __gAPIVersion = __gRuntimeLoader->api_version; 56 57 if (programPath) { 58 if ((__progname = strrchr(programPath, '/')) == NULL) 59 __progname = programPath; 60 else 61 __progname++; 62 } 63 64 __libc_argc = __gRuntimeLoader->program_args->arg_count; 65 __libc_argv = argv_save = __gRuntimeLoader->program_args->args; 66 67 __gRuntimeLoader->call_atexit_hooks_for_range 68 = _call_atexit_hooks_for_range; 69 70 if (__gRuntimeLoader->program_args->umask != (mode_t)-1) 71 umask(__gRuntimeLoader->program_args->umask); 72 73 __main_thread_id = pthread_self()->id = find_thread(NULL); 74 75 get_system_info(&info); 76 __gCPUCount = info.cpu_count; 77 78 __init_time((addr_t)__gCommPageAddress); 79 __init_env(__gRuntimeLoader->program_args); 80 __init_heap(); 81 __init_env_post_heap(); 82 __init_pwd_backend(); 83 __init_stack_protector(); 84 __set_stack_protection(); 85 } 86 87 88 void _init_c_library_(void); 89 void 90 _init_c_library_(void) 91 { 92 // This function is called from the BeOS start_dyn.o - so it's called once 93 // for every application that was compiled under BeOS. 94 // Our libroot functions are already initialized above, so we don't have to 95 // do anything here. 96 } 97 98 99 void 100 terminate_after(image_id id) 101 { 102 __heap_terminate_after(); 103 } 104