From bdcf9c379585c3b6ef4a183689dc4d28432d4850 Mon Sep 17 00:00:00 2001 From: Hubert Badocha Date: Wed, 29 Nov 2023 13:44:55 +0100 Subject: [PATCH] Change libphoenix initialization This change prepares libphoenix to be used in dynamic loader, where crt0 is not included. Moved constructor and destrutor calling into crt0. Wrapped libphoenix initialization into a single function to reduce crt0 and libphoenix intertwine. JIRA: RTOS-694 --- _startc.c | 71 +++++++++++++++++++++++++++++++++++++++------------ misc/Makefile | 2 +- misc/fini.c | 36 -------------------------- misc/init.c | 40 ++++++++++++----------------- stdlib/exit.c | 2 -- 5 files changed, 72 insertions(+), 79 deletions(-) delete mode 100644 misc/fini.c diff --git a/_startc.c b/_startc.c index d1f4a7c6..a19f5731 100644 --- a/_startc.c +++ b/_startc.c @@ -13,19 +13,60 @@ * %LICENSE% */ -#include #include -#include -extern void _malloc_init(void); -extern int _env_init(void); -extern void _signals_init(void); -extern void _file_init(void); -extern void _errno_init(void); -extern void _atexit_init(void); -extern void _init_array(void); -extern void _pthread_init(void); +extern void (*__preinit_array_start[])(void); +extern void (*__preinit_array_end[])(void); + +extern void (*__init_array_start[])(void); +extern void (*__init_array_end[])(void); + + +extern void _init(void); + + +void _init_array(void) +{ + size_t i, sz; + + sz = __preinit_array_end - __preinit_array_start; + for (i = 0; i < sz; i++) { + __preinit_array_start[i](); + } + + /* FIXME: change compilation settings to make access to _init() */ + /* _init(); */ + + sz = __init_array_end - __init_array_start; + for (i = 0; i < sz; i++) { + __init_array_start[i](); + } +} + + +extern void (*__fini_array_start[])(void); +extern void (*__fini_array_end[])(void); + + +extern void _fini(void); + + +void _fini_array(void) +{ + size_t i, sz; + + sz = __fini_array_end - __fini_array_start; + for (i = sz; i > 0; i--) { + __fini_array_start[i - 1](); + } + + /* FIXME: change compilation settings to make access to _fini() */ + /* _fini(); */ +} + + +extern void _libc_init(void); extern int main(int argc, char **argv); @@ -38,14 +79,10 @@ void _startc(int argc, char **argv, char **env) environ = env; argv_progname = *argv; - _atexit_init(); - _errno_init(); - _malloc_init(); - _env_init(); - _signals_init(); - _file_init(); + _libc_init(); + _init_array(); - _pthread_init(); + atexit(_fini_array); exit(main(argc, argv)); } diff --git a/misc/Makefile b/misc/Makefile index 45bc7efc..d00b7afa 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -4,4 +4,4 @@ # Copyright 2021 Phoenix Systems # -OBJS += $(addprefix $(PREFIX_O)misc/, init.o fini.o) +OBJS += $(addprefix $(PREFIX_O)misc/, init.o) diff --git a/misc/fini.c b/misc/fini.c deleted file mode 100644 index 3fbae37f..00000000 --- a/misc/fini.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Phoenix-RTOS - * - * libphoenix - * - * fini array - * - * Copyright 2021 Phoenix Systems - * Author: Hubert Buczynski - * - * This file is part of Phoenix-RTOS. - * - * %LICENSE% - */ - - -#include - - -extern void (*__fini_array_start[])(void); -extern void (*__fini_array_end[])(void); - -extern void _fini (void); - - -void _fini_array(void) -{ - size_t i, sz; - - sz = __fini_array_end - __fini_array_start; - for (i = sz; i > 0; i--) - __fini_array_start[i-1](); - - /* FIXME: change compilation settings to make access to _fini() */ - /* _fini(); */ -} diff --git a/misc/init.c b/misc/init.c index 4b842499..fb14ea38 100644 --- a/misc/init.c +++ b/misc/init.c @@ -3,7 +3,7 @@ * * libphoenix * - * init array + * init * * Copyright 2021 Phoenix Systems * Author: Hubert Buczynski @@ -14,29 +14,23 @@ */ -#include +extern void _malloc_init(void); +extern int _env_init(void); +extern void _signals_init(void); +extern void _file_init(void); +extern void _errno_init(void); +extern void _atexit_init(void); +extern void _init_array(void); +extern void _pthread_init(void); -extern void (*__preinit_array_start[])(void); -extern void (*__preinit_array_end[])(void); -extern void (*__init_array_start[])(void); -extern void (*__init_array_end[])(void); - - -extern void _init (void); - -void _init_array(void) +void _libc_init(void) { - size_t i, sz; - - sz = __preinit_array_end - __preinit_array_start; - for (i = 0; i < sz; i++) - __preinit_array_start[i](); - - /* FIXME: change compilation settings to make access to _init() */ - /* _init(); */ - - sz = __init_array_end - __init_array_start; - for (i = 0; i < sz; i++) - __init_array_start[i](); + _atexit_init(); + _errno_init(); + _malloc_init(); + _env_init(); + _signals_init(); + _file_init(); + _pthread_init(); } diff --git a/stdlib/exit.c b/stdlib/exit.c index 96216982..c051e9bc 100644 --- a/stdlib/exit.c +++ b/stdlib/exit.c @@ -17,7 +17,6 @@ #include extern void _atexit_call(void); -extern void _fini_array(void); extern void sys_exit(int) __attribute__((noreturn)); @@ -37,7 +36,6 @@ void exit(int status) { fflush(NULL); _atexit_call(); - _fini_array(); _exit(status); for(;;); }