diff --git a/src/libraries/libc/arch/amd64/crt/crt0.s b/src/libraries/libc/arch/amd64/crt/crt0.s index 280a28a..6353370 100644 --- a/src/libraries/libc/arch/amd64/crt/crt0.s +++ b/src/libraries/libc/arch/amd64/crt/crt0.s @@ -1,12 +1,14 @@ extern main extern exit extern __init_libj6 +extern __init_libc global _start:function (_start.end - _start) _start: mov rbp, rsp mov rdi, rsp call __init_libj6 + call __init_libc pop rdi mov rsi, rsp diff --git a/src/libraries/libc/arch/amd64/crt/init.cpp b/src/libraries/libc/arch/amd64/crt/init.cpp new file mode 100644 index 0000000..b183c01 --- /dev/null +++ b/src/libraries/libc/arch/amd64/crt/init.cpp @@ -0,0 +1,27 @@ +#include + +using cb = void (*)(void); +extern cb __init_array_start[0]; +extern cb __init_array_end; + +namespace { + +void +run_global_ctors() +{ + size_t i = 0; + while (true) { + const cb &fp = __init_array_start[i++]; + if (&fp == &__init_array_end) + return; + fp(); + } +} + +} // namespace + +extern "C" +void __init_libc() +{ + run_global_ctors(); +} diff --git a/src/user/srv.init/start.s b/src/user/srv.init/start.s index 8244410..33229dd 100644 --- a/src/user/srv.init/start.s +++ b/src/user/srv.init/start.s @@ -1,6 +1,7 @@ extern main extern exit extern __init_libj6 +extern __init_libc extern _arg_modules_phys section .bss @@ -28,6 +29,7 @@ _start: mov rbp, rsp mov rdi, rsp call __init_libj6 + call __init_libc pop rdi mov rsi, rsp