mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-24 21:45:20 +00:00
It's a bad idea to have a global event loop in a client application as that will cause an initialization-order fiasco in ASAN. Therefore, LibC now has a flag "s_global_initializers_ran" which is false until _entry in crt0 runs, which in turn only gets called after all the global initializers were actually executed. The EventLoop constructor checks the flag and crashes the program if it is being called as a global constructor. A note next to the VERIFY_NOT_REACHED() informs the developer of these things and how we usually instantiate event loops. The upshot of this is that global event loops will cause a crash before any undefined behavior is hit.
42 lines
692 B
C++
42 lines
692 B
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <AK/Types.h>
|
|
#include <assert.h>
|
|
#include <sys/internals.h>
|
|
#include <unistd.h>
|
|
|
|
extern "C" {
|
|
|
|
#ifdef NO_TLS
|
|
int errno;
|
|
#else
|
|
__thread int errno;
|
|
#endif
|
|
char** environ;
|
|
bool __environ_is_malloced;
|
|
bool __stdio_is_initialized;
|
|
bool s_global_initializers_ran;
|
|
void* __auxiliary_vector;
|
|
|
|
static void __auxiliary_vector_init();
|
|
|
|
void __libc_init()
|
|
{
|
|
__auxiliary_vector_init();
|
|
__malloc_init();
|
|
__stdio_init();
|
|
}
|
|
|
|
static void __auxiliary_vector_init()
|
|
{
|
|
char** env;
|
|
for (env = environ; *env; ++env) {
|
|
}
|
|
|
|
__auxiliary_vector = (void*)++env;
|
|
}
|
|
}
|