summaryrefslogtreecommitdiff
path: root/src/ldso/dynlink.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-07-31 00:04:10 -0400
committerRich Felker <dalias@aerifal.cx>2013-07-31 00:04:10 -0400
commitd0c6cb05e71e624338571cda28f5c17d3ab0004c (patch)
treeeb03e76982a300df4b85541c5cc1670a1c7a9a93 /src/ldso/dynlink.c
parent9a8d7bee80063118439fd6b368b9bb43d930ea19 (diff)
downloadmusl-d0c6cb05e71e624338571cda28f5c17d3ab0004c.tar.gz
don't call null pointer if DT_INIT/DT_FINI are null
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).
Diffstat (limited to 'src/ldso/dynlink.c')
-rw-r--r--src/ldso/dynlink.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c
index 8d857d72..3c963e22 100644
--- a/src/ldso/dynlink.c
+++ b/src/ldso/dynlink.c
@@ -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)) {