xref: /haiku/src/system/libroot/libroot_init.c (revision 4a55cc230cf7566cadcbb23b1928eefff8aea9a2)
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