#include typedef void (*constructor)(); extern "C" { /* .text */ uint32_t begin_text; uint32_t end_text; /* .rodata */ uint32_t begin_rodata; uint32_t end_rodata; /* .data */ uint32_t begin_constinit; uint32_t end_constinit; constructor begin_ctors; constructor end_ctors; uint32_t begin_data; uint32_t end_data; /* .bss */ uint32_t begin_bss; uint32_t end_bss; void kernel_constructors() { for (constructor* i = &begin_ctors; i != &end_ctors; ++i) (*i)(); } void dump_address() { printk("text begin: ", uhex{reinterpret_cast(&begin_text)}, " end: ", uhex{reinterpret_cast(&end_text)}, '\n'); printk("rodata begin: ", uhex{reinterpret_cast(&begin_rodata)}, " end: ", uhex{reinterpret_cast(&end_rodata)}, '\n'); printk("constinit begin: ", uhex{reinterpret_cast(&begin_constinit)}, " end: ", uhex{reinterpret_cast(&end_constinit)}, '\n'); printk("ctors begin: ", uhex{reinterpret_cast(&begin_ctors)}, " end: ", uhex{reinterpret_cast(&end_ctors)}, '\n'); printk("data begin: ", uhex{reinterpret_cast(&begin_data)}, " end: ", uhex{reinterpret_cast(&end_data)}, '\n'); printk("bss begin: ", uhex{reinterpret_cast(&begin_bss)}, " end: ", uhex{reinterpret_cast(&end_bss)}, '\n'); } } // extern "C"