HelenOS sources
This source file includes following definitions.
- __libc_main
- __libc_fini
- __libc_exit
- __libc_abort
#include <errno.h>
#include <libc.h>
#include <stdbool.h>
#include <stdlib.h>
#include <tls.h>
#include <fibril.h>
#include <fibril_synch.h>
#include <task.h>
#include <loader/pcb.h>
#include <vfs/vfs.h>
#include <vfs/inbox.h>
#include <io/kio.h>
#include "private/libc.h"
#include "private/async.h"
#include "private/malloc.h"
#include "private/io.h"
#include "private/fibril.h"
#ifdef CONFIG_RTLD
#include <rtld/rtld.h>
#endif
progsymbols_t __progsymbols;
static bool env_setup;
static fibril_t main_fibril;
void __libc_main(void *pcb_ptr)
{
__kio_init();
assert(!__tcb_is_set());
__pcb = (pcb_t *) pcb_ptr;
if (__pcb) {
main_fibril.tcb = __pcb->tcb;
} else {
main_fibril.tcb = tls_make_initial(__progsymbols.elfstart);
}
assert(main_fibril.tcb);
__fibrils_init();
__fibril_synch_init();
main_fibril.tcb->fibril_data = &main_fibril;
__tcb_set(main_fibril.tcb);
fibril_setup(&main_fibril);
__malloc_init();
#ifdef CONFIG_RTLD
if (__pcb != NULL && __pcb->rtld_runtime != NULL) {
runtime_env = (rtld_t *) __pcb->rtld_runtime;
} else {
if (rtld_init_static() != EOK)
abort();
}
#endif
__async_server_init();
__async_client_init();
__async_ports_init();
env_setup = true;
int argc;
char **argv;
if (__pcb == NULL) {
argc = 0;
argv = NULL;
__stdio_init();
} else {
argc = __pcb->argc;
argv = __pcb->argv;
__inbox_init(__pcb->inbox, __pcb->inbox_entries);
__stdio_init();
vfs_root_set(inbox_get("root"));
(void) vfs_cwd_set(__pcb->cwd);
}
if (__progsymbols.preinit_array) {
for (int i = __progsymbols.preinit_array_len - 1; i >= 0; --i)
__progsymbols.preinit_array[i]();
}
if (__progsymbols.init_array) {
for (int i = __progsymbols.init_array_len - 1; i >= 0; --i)
__progsymbols.init_array[i]();
}
int retval = __progsymbols.main(argc, argv);
exit(retval);
}
void __libc_fini(void)
{
__async_client_fini();
__async_server_fini();
__async_ports_fini();
__fibril_synch_fini();
__fibrils_fini();
__malloc_fini();
__kio_fini();
}
void __libc_exit(int status)
{
for (int i = 0; i < __progsymbols.fini_array_len; ++i)
__progsymbols.fini_array[i]();
if (env_setup) {
__stdio_done();
task_retval(status);
}
__SYSCALL1(SYS_TASK_EXIT, false);
__builtin_unreachable();
}
void __libc_abort(void)
{
__SYSCALL1(SYS_TASK_EXIT, true);
__builtin_unreachable();
}
HelenOS homepage, sources at GitHub