Half-assed global constructors

This commit is contained in:
Mark 2020-10-19 16:51:19 +03:00
parent b5d96e64cb
commit 17bc4609e8

View File

@ -12,6 +12,17 @@ extern char **environ;
extern uintptr_t __libc_orig_argp_base;
extern size_t __libc_orig_argp_count;
extern uintptr_t __init_array_start;
extern uintptr_t __init_array_end;
static void call_constructors(void) {
size_t init_array_size = ((void *) &__init_array_end - (void *) &__init_array_start) / sizeof(uintptr_t);
for (size_t i = 0; i < init_array_size; ++i) {
uintptr_t entry = (&__init_array_start)[i];
((void(*)(void)) entry)();
}
}
void _start(void *_arg) {
uintptr_t arg = (uintptr_t) _arg;
// arg: argp page number << 24 | 12 bit page count << 12 | 12 bit argc
@ -25,5 +36,10 @@ void _start(void *_arg) {
__libc_signal_init();
extern void _init(void);
_init();
call_constructors();
exit(main(argc, argp));
}