From: Rich Felker Date: Fri, 5 Oct 2012 01:08:53 +0000 (-0400) Subject: remove freeing of dynamic linker data when dlopen/dlsym are not used X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=commitdiff_plain;h=c91aa03d2488ef2c48276510dec360ed9582e861;hp=9b153c043ea486d28f96a7e01419f650fe0e1b26 remove freeing of dynamic linker data when dlopen/dlsym are not used this was an optimization to save/recover a minimal amount of extra memory for use by malloc, that's becoming increasingly costly to keep around. freeing this data: 1. breaks debugging with gdb (it can't find library symbols) 2. breaks thread-local storage in shared libraries it would be possible to disable freeing when TLS is used, but in addition to the above breakages, tracking whether dlopen/dlsym is used adds a cost to every symbol lookup, possibly making program startup slower for large programs. combined with the complexity, it's not worth it. we already save/recover plenty of memory in the dynamic linker with reclaim_gaps. --- diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 774ab849..8ff8e696 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -80,7 +80,6 @@ void *__install_initial_tls(void *); static struct dso *head, *tail, *libc; static char *env_path, *sys_path, *r_path; -static int rtld_used; static int ssp_used; static int runtime; static int ldd_mode; @@ -182,13 +181,9 @@ static void *find_sym(struct dso *dso, const char *s, int need_def) void *def = 0; if (dso->ghashtab) { gh = gnu_hash(s); - if (gh == 0xf9040207 && !strcmp(s, "dlopen")) rtld_used = 1; - if (gh == 0xf4dc4ae && !strcmp(s, "dlsym")) rtld_used = 1; if (gh == 0x1f4039c9 && !strcmp(s, "__stack_chk_fail")) ssp_used = 1; } else { h = sysv_hash(s); - if (h == 0x6b366be && !strcmp(s, "dlopen")) rtld_used = 1; - if (h == 0x6b3afd && !strcmp(s, "dlsym")) rtld_used = 1; if (h == 0x595a4cc && !strcmp(s, "__stack_chk_fail")) ssp_used = 1; } for (; dso; dso=dso->next) { @@ -862,12 +857,6 @@ void *__dynlink(int argc, char **argv) do_init_fini(tail); - if (!rtld_used) { - free_all(head); - free(sys_path); - reclaim((void *)builtin_dsos, 0, sizeof builtin_dsos); - } - errno = 0; return (void *)aux[AT_ENTRY]; }