malloc: Use __libc_initial to detect an inner libc

The secondary/non-primary/inner libc (loaded via dlmopen, LD_AUDIT,
static dlopen) must not use sbrk to allocate member because that would
interfere with allocations in the outer libc.  On Linux, this does not
matter because sbrk itself was changed to fail in secondary libcs.

 _dl_addr occasionally shows up in profiles, but had to be used before
because __libc_multiple_libs was unreliable.  So this change achieves
a slight reduction in startup time.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Florian Weimer 2020-12-16 15:09:52 +01:00
parent e7570f4131
commit 29a4db291b
2 changed files with 7 additions and 8 deletions

View File

@ -294,14 +294,11 @@ ptmalloc_init (void)
__malloc_initialized = 0;
#ifdef SHARED
/* In case this libc copy is in a non-default namespace, never use brk.
Likewise if dlopened from statically linked program. */
Dl_info di;
struct link_map *l;
if (_dl_open_hook != NULL
|| (_dl_addr (ptmalloc_init, &di, &l, NULL) != 0
&& l->l_ns != LM_ID_BASE))
/* In case this libc copy is in a non-default namespace, never use
brk. Likewise if dlopened from statically linked program. The
generic sbrk implementation also enforces this, but it is not
used on Hurd. */
if (!__libc_initial)
__morecore = __failing_morecore;
#endif

View File

@ -247,6 +247,8 @@
/* For SINGLE_THREAD_P. */
#include <sysdep-cancel.h>
#include <libc-internal.h>
/*
Debugging: