don't call null pointer if DT_INIT/DT_FINI are null
authorRich Felker <dalias@aerifal.cx>
Wed, 31 Jul 2013 04:04:10 +0000 (00:04 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 31 Jul 2013 04:04:10 +0000 (00:04 -0400)
it's not clear to me why the linker even outputs these headers if they
are null, but apparently it does so. with the default startfiles, they
will never be null anyway, but this patch allows eliminating crti,
crtn, crtbegin, and crtend (leaving only crt1) if the toolchain is
using init_array/fini_array (or for a C-only, no-ctor environment).

src/ldso/dynlink.c

index 8d857d72022a2d09c26621ba161b1a8bf76167bd..3c963e22a20ec2e734fc7700eecda1207743efe4 100644 (file)
@@ -715,7 +715,7 @@ static void do_fini()
                        while (n--) ((void (*)(void))*--fn)();
                }
 #ifndef NO_LEGACY_INITFINI
-               if (dyn[0] & (1<<DT_FINI))
+               if ((dyn[0] & (1<<DT_FINI)) && dyn[DT_FINI])
                        ((void (*)(void))(p->base + dyn[DT_FINI]))();
 #endif
        }
@@ -738,7 +738,7 @@ static void do_init_fini(struct dso *p)
                        fini_head = p;
                }
 #ifndef NO_LEGACY_INITFINI
-               if (dyn[0] & (1<<DT_INIT))
+               if ((dyn[0] & (1<<DT_INIT)) && dyn[DT_INIT])
                        ((void (*)(void))(p->base + dyn[DT_INIT]))();
 #endif
                if (dyn[0] & (1<<DT_INIT_ARRAY)) {