From d20c77c618556ab4c1e5f555551feb4be1442095 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sat, 12 Feb 2022 13:55:07 -0800 Subject: [PATCH] [libc] Call global ctors in user code This change adds a new __init_libc function which calls all the global ctors in .init_array, and is called from _start. --- src/libraries/libc/arch/amd64/crt/crt0.s | 2 ++ src/libraries/libc/arch/amd64/crt/init.cpp | 27 ++++++++++++++++++++++ src/user/srv.init/start.s | 2 ++ 3 files changed, 31 insertions(+) create mode 100644 src/libraries/libc/arch/amd64/crt/init.cpp 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