unify static and dynamic libc init/fini code paths
authorRich Felker <dalias@aerifal.cx>
Thu, 12 Nov 2015 03:08:23 +0000 (22:08 -0500)
committerRich Felker <dalias@aerifal.cx>
Thu, 12 Nov 2015 03:08:23 +0000 (22:08 -0500)
use weak definitions that the dynamic linker can override instead of
preprocessor conditionals on SHARED so that the same libc start and
exit code can be used for both static and dynamic linking.

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

index d1f6a5e11427b8aba897e1e626264c75c4ce6b3f..7ffada0bae1837a971a183108c43804235d75092 100644 (file)
@@ -8,21 +8,15 @@
 
 void __init_tls(size_t *);
 
-#ifndef SHARED
-static void dummy() {}
-weak_alias(dummy, _init);
+extern void _init() __attribute__((weak));
 extern void (*const __init_array_start)() __attribute__((weak));
 extern void (*const __init_array_end)() __attribute__((weak));
-#endif
 
 static void dummy1(void *p) {}
 weak_alias(dummy1, __init_ssp);
 
 #define AUX_CNT 38
 
-#ifndef SHARED
-static
-#endif
 void __init_libc(char **envp, char *pn)
 {
        size_t i, *auxv, aux[AUX_CNT] = { 0 };
@@ -57,20 +51,22 @@ void __init_libc(char **envp, char *pn)
        libc.secure = 1;
 }
 
+static void libc_start_init(void)
+{
+       if (_init) _init();
+       uintptr_t a = (uintptr_t)&__init_array_start;
+       for (; a<(uintptr_t)&__init_array_end; a+=sizeof(void(*)()))
+               (*(void (**)())a)();
+}
+
+weak_alias(libc_start_init, __libc_start_init);
+
 int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv)
 {
        char **envp = argv+argc+1;
 
-#ifndef SHARED
        __init_libc(envp, argv[0]);
-       _init();
-       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 */
        exit(main(argc, argv, envp));
index 163d8f1b22a996d55230bcbf86d5c2890404684c..b391f33871a86473dc8acd3228b2c5f1a1e0a0db 100644 (file)
@@ -11,24 +11,24 @@ static void dummy()
 weak_alias(dummy, __funcs_on_exit);
 weak_alias(dummy, __stdio_exit);
 
-#ifndef SHARED
-weak_alias(dummy, _fini);
+extern void _fini() __attribute__((weak));
 extern void (*const __fini_array_start)() __attribute__((weak));
 extern void (*const __fini_array_end)() __attribute__((weak));
-#endif
 
-_Noreturn void exit(int code)
+static void libc_exit_fini(void)
 {
-       __funcs_on_exit();
-
-#ifndef SHARED
        uintptr_t a = (uintptr_t)&__fini_array_end;
        for (; a>(uintptr_t)&__fini_array_start; a-=sizeof(void(*)()))
                (*(void (**)())(a-sizeof(void(*)())))();
-       _fini();
-#endif
+       if (_fini) _fini();
+}
 
-       __stdio_exit();
+weak_alias(libc_exit_fini, __libc_exit_fini);
 
+_Noreturn void exit(int code)
+{
+       __funcs_on_exit();
+       __libc_exit_fini();
+       __stdio_exit();
        _Exit(code);
 }
index 5fbe2bb5471ffe8824778bc5f2a8adc713552ef5..ac755d94b5fc3613ce1223bce5f24f232144468a 100644 (file)
@@ -1175,7 +1175,7 @@ static void kernel_mapped_dso(struct dso *p)
        p->kernel_mapped = 1;
 }
 
-static void do_fini()
+void __libc_exit_fini()
 {
        struct dso *p;
        size_t dyn[DYN_CNT];
@@ -1659,8 +1659,6 @@ _Noreturn void __dls3(size_t *sp)
        debug.state = 0;
        _dl_debug_state();
 
-       __init_libc(envp, argv[0]);
-       atexit(do_fini);
        errno = 0;
 
        CRTJMP((void *)aux[AT_ENTRY], argv-1);