about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/env/__libc_start_main.c3
-rw-r--r--src/ldso/dynlink.c6
2 files changed, 8 insertions, 1 deletions
diff --git a/src/env/__libc_start_main.c b/src/env/__libc_start_main.c
index f6f3b14a..d1f6a5e1 100644
--- a/src/env/__libc_start_main.c
+++ b/src/env/__libc_start_main.c
@@ -67,6 +67,9 @@ int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv)
 	uintptr_t a = (uintptr_t)&__init_array_start;
 	for (; a<(uintptr_t)&__init_array_end; a+=sizeof(void(*)()))
 		(*(void (**)())a)();
+#else
+	void __libc_start_init(void);
+	__libc_start_init();
 #endif
 
 	/* Pass control to the application */
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c
index 8967505a..f144aa59 100644
--- a/src/ldso/dynlink.c
+++ b/src/ldso/dynlink.c
@@ -1203,6 +1203,11 @@ static void do_init_fini(struct dso *p)
 	if (need_locking) pthread_mutex_unlock(&init_fini_lock);
 }
 
+void __libc_start_init(void)
+{
+	do_init_fini(tail);
+}
+
 static void dl_debug_state(void)
 {
 }
@@ -1630,7 +1635,6 @@ _Noreturn void __dls3(size_t *sp)
 	__init_libc(envp, argv[0]);
 	atexit(do_fini);
 	errno = 0;
-	do_init_fini(tail);
 
 	CRTJMP((void *)aux[AT_ENTRY], argv-1);
 	for(;;);