#include <../libsys/stub.h> #ifdef __cplusplus extern "C" { #endif extern void _init(); extern void _fini(); extern void main(); extern void (*__preinit_array_start[])(); extern void (*__preinit_array_end[])(); extern void (*__init_array_start[])(); extern void (*__init_array_end[])(); extern void (*__fini_array_start[])(); extern void (*__fini_array_end[])(); [[gnu::used]] [[noreturn]] void start() { const unsigned int preinit_size = __preinit_array_end - __preinit_array_start; for (unsigned int i = 0; i != preinit_size; ++i) (*__preinit_array_start[i])(); const unsigned int init_size = __init_array_end - __init_array_start; for (unsigned int i = 0; i != init_size; ++i) (*__init_array_start[i])(); main(); const unsigned int fini_size = __fini_array_end - __fini_array_start; for (unsigned int i = 0; i != fini_size; ++i) (*__fini_array_start[i])(); sys_exit(); while (true) { } } // additional C++ stuff void __cxa_pure_virtual() { // pure virtual error } // For libraries int __cxa_atexit(void (*func)(void *), void *arg, void *dso_handle) { (void)func; (void)arg; (void)dso_handle; return 0; } #ifdef __cplusplus } #endif void *operator new([[maybe_unused]] __SIZE_TYPE__ n) { return reinterpret_cast(0xdeadbeef); } void *operator new[]([[maybe_unused]] __SIZE_TYPE__ n) { return reinterpret_cast(0xdeadbeef); } void operator delete[](void *ptr) { operator delete(ptr); } void operator delete[](void *ptr, [[maybe_unused]] __SIZE_TYPE__ size) { operator delete(ptr); } void operator delete([[maybe_unused]] void *ptr) {} void operator delete(void *ptr, [[maybe_unused]] __SIZE_TYPE__ size) { operator delete(ptr); }