[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.
This commit is contained in:
Justin C. Miller
2022-02-12 13:55:07 -08:00
parent ba610864c7
commit d20c77c618
3 changed files with 31 additions and 0 deletions

View File

@@ -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

View File

@@ -0,0 +1,27 @@
#include <stddef.h>
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();
}

View File

@@ -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