Half-assed global constructors
This commit is contained in:
parent
b5d96e64cb
commit
17bc4609e8
16
crt/crt0.c
16
crt/crt0.c
@ -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));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user