move calls to application init functions after crt1 entry point
authorRich Felker <dalias@aerifal.cx>
Tue, 22 Sep 2015 20:24:28 +0000 (20:24 +0000)
committerRich Felker <dalias@aerifal.cx>
Tue, 22 Sep 2015 20:24:28 +0000 (20:24 +0000)
this change is needed to be compatible with fdpic, where some of the
main application's relocations may be performed as part of the crt1
entry point. if we call init functions before passing control, these
relocations will not yet have been performed, and the init code will
potentially make use of invalid pointers.

conceptually, no code provided by the application or third-party
libraries should run before the application entry point. the
difference is not observable to programs using the crt1 we provide,
but it could come into play if custom entry point code is used, so
it's better to be doing this right anyway.

src/env/__libc_start_main.c
src/ldso/dynlink.c

index f6f3b14a471bfb8f7346a98d7c5f008c6ec5ba0c..d1f6a5e11427b8aba897e1e626264c75c4ce6b3f 100644 (file)
@@ -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 */
index 8967505a0a17b2cafa44841f154b130ee59c2b5c..f144aa597f3586ba2dc6bc8bbdba3e6bf159a449 100644 (file)
@@ -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(;;);