>From 18cfe83a9f3afacb03f3cad8e8b9d78121179451 Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Sun, 15 May 2016 20:11:42 +0000 Subject: [PATCH] add preinit_array support --- ldso/dynlink.c | 13 +++++++++++++ src/env/__libc_start_main.c | 8 +++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ldso/dynlink.c b/ldso/dynlink.c index e458f38..38709ec 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -1207,6 +1207,18 @@ void __libc_exit_fini() } } +static void do_preinit(void) +{ + size_t *v, *fn, n=0; + + for (v = head->dynv; v[0]; v+=2) + if (v[0] == DT_PREINIT_ARRAY) + fn = laddr(head, v[1]); + else if (v[0] == DT_PREINIT_ARRAYSZ) + n = v[1]/sizeof(size_t); + while (n--) ((void(*)(void))*fn++)(); +} + static void do_init_fini(struct dso *p) { size_t dyn[DYN_CNT]; @@ -1242,6 +1254,7 @@ static void do_init_fini(struct dso *p) void __libc_start_init(void) { + do_preinit(); do_init_fini(tail); } diff --git a/src/env/__libc_start_main.c b/src/env/__libc_start_main.c index 5c79be2..1397ec4 100644 --- a/src/env/__libc_start_main.c +++ b/src/env/__libc_start_main.c @@ -12,6 +12,9 @@ static void dummy(void) {} weak_alias(dummy, _init); __attribute__((__weak__, __visibility__("hidden"))) +extern void (*const __preinit_array_start)(void), (*const __preinit_array_end)(void); + +__attribute__((__weak__, __visibility__("hidden"))) extern void (*const __init_array_start)(void), (*const __init_array_end)(void); static void dummy1(void *p) {} @@ -55,8 +58,11 @@ void __init_libc(char **envp, char *pn) static void libc_start_init(void) { + uintptr_t a = (uintptr_t)&__preinit_array_start; + for (; a<(uintptr_t)&__preinit_array_end; a+=sizeof(void(*)())) + (*(void (**)())a)(); _init(); - uintptr_t a = (uintptr_t)&__init_array_start; + a = (uintptr_t)&__init_array_start; for (; a<(uintptr_t)&__init_array_end; a+=sizeof(void(*)())) (*(void (**)())a)(); } -- 2.8.1