Message ID | cea55c7e3af9244e97cd40ffdac8e87ab1258d38.1581182210.git.fweimer@redhat.com |
---|---|
State | New |
Headers | show |
Series | Avoid malloc symbol interposition in the dynamic loader [BZ #25486] | expand |
On 2/8/20 2:01 PM, Florian Weimer wrote: > Exporting functions and relying on symbol interposition from libc.so > makes the choice of implementation dependent on DT_NEEDED order, which > is not what some compiler drivers expect. > > This commit replaces one magic mechanism (symbol interposition) with > another one (preprocessor-/compiler-based redirection). This makes > the hand-over from the minimal malloc to the full malloc more > explicit. I LOVE that! Explicit hand-over is much better. > Removing the ABI symbols is backwards-compatible because libc.so is > always in scope, and the dynamic loader will find the malloc-related > symbols there since commit f0b2132b35248c1f4a80f62a2c38cddcc802aa8c > ("ld.so: Support moving versioned symbols between sonames > [BZ #24741]"). Agreed. If anyone argues otherwise I'd like to see the use case e.g. ld.so without libc.so.6. > Tested on aarch64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, > s390x-linux-gnu without the stack protector, and on x86_64-linux-gnu > with stack-protector-strong. Also built with build-many-glibcs.py. OK for master. Reviewed-by: Carlos O'Donell <carlos@redhat.com> > --- > elf/Makefile | 6 +- > elf/Versions | 3 - > elf/dl-lookup.c | 4 +- > elf/dl-minimal.c | 97 ++++++++++++++++--- > elf/rtld.c | 12 +++ > include/inline-hashtab.h | 4 +- > include/libc-symbols.h | 9 +- > include/malloc.h | 2 + > include/rtld-malloc.h | 85 ++++++++++++++++ > include/stdlib.h | 2 + > sysdeps/generic/localplt.data | 6 -- > sysdeps/mach/hurd/i386/ld.abilist | 4 - > sysdeps/mach/hurd/i386/localplt.data | 6 -- > sysdeps/unix/sysv/linux/aarch64/ld.abilist | 4 - > sysdeps/unix/sysv/linux/aarch64/localplt.data | 6 -- > sysdeps/unix/sysv/linux/alpha/ld.abilist | 4 - > sysdeps/unix/sysv/linux/alpha/localplt.data | 6 -- > sysdeps/unix/sysv/linux/arm/be/ld.abilist | 4 - > sysdeps/unix/sysv/linux/arm/le/ld.abilist | 4 - > sysdeps/unix/sysv/linux/arm/localplt.data | 6 -- > sysdeps/unix/sysv/linux/csky/ld.abilist | 4 - > sysdeps/unix/sysv/linux/csky/localplt.data | 6 -- > sysdeps/unix/sysv/linux/hppa/ld.abilist | 4 - > sysdeps/unix/sysv/linux/hppa/localplt.data | 6 -- > sysdeps/unix/sysv/linux/i386/ld.abilist | 4 - > sysdeps/unix/sysv/linux/i386/localplt.data | 6 -- > sysdeps/unix/sysv/linux/ia64/ld.abilist | 4 - > sysdeps/unix/sysv/linux/ia64/localplt.data | 6 -- > .../unix/sysv/linux/m68k/coldfire/ld.abilist | 4 - > .../sysv/linux/m68k/coldfire/localplt.data | 6 -- > .../unix/sysv/linux/m68k/m680x0/ld.abilist | 4 - > .../unix/sysv/linux/m68k/m680x0/localplt.data | 6 -- > sysdeps/unix/sysv/linux/microblaze/ld.abilist | 4 - > .../unix/sysv/linux/microblaze/localplt.data | 6 -- > .../unix/sysv/linux/mips/mips32/ld.abilist | 4 - > .../sysv/linux/mips/mips64/n32/ld.abilist | 4 - > .../sysv/linux/mips/mips64/n64/ld.abilist | 4 - > sysdeps/unix/sysv/linux/nios2/ld.abilist | 4 - > sysdeps/unix/sysv/linux/nios2/localplt.data | 6 -- > .../linux/powerpc/powerpc32/fpu/localplt.data | 6 -- > .../sysv/linux/powerpc/powerpc32/ld.abilist | 4 - > .../powerpc/powerpc32/nofpu/localplt.data | 6 -- > .../linux/powerpc/powerpc64/be/ld.abilist | 4 - > .../linux/powerpc/powerpc64/le/ld.abilist | 4 - > .../linux/powerpc/powerpc64/localplt.data | 6 -- > sysdeps/unix/sysv/linux/riscv/localplt.data | 6 -- > sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist | 4 - > sysdeps/unix/sysv/linux/s390/localplt.data | 6 -- > .../unix/sysv/linux/s390/s390-32/ld.abilist | 4 - > .../unix/sysv/linux/s390/s390-64/ld.abilist | 4 - > sysdeps/unix/sysv/linux/sh/be/ld.abilist | 4 - > sysdeps/unix/sysv/linux/sh/le/ld.abilist | 4 - > sysdeps/unix/sysv/linux/sh/localplt.data | 6 -- > .../unix/sysv/linux/sparc/sparc32/ld.abilist | 4 - > .../sysv/linux/sparc/sparc32/localplt.data | 6 -- > .../unix/sysv/linux/sparc/sparc64/ld.abilist | 4 - > .../sysv/linux/sparc/sparc64/localplt.data | 6 -- > sysdeps/unix/sysv/linux/x86_64/64/ld.abilist | 4 - > sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist | 4 - > sysdeps/x86_64/localplt.data | 6 -- > 60 files changed, 202 insertions(+), 266 deletions(-) > create mode 100644 include/rtld-malloc.h > > diff --git a/elf/Makefile b/elf/Makefile > index 60c8082d06..74462a5e65 100644 > --- a/elf/Makefile > +++ b/elf/Makefile > @@ -486,7 +486,11 @@ $(objpfx)dl-allobjs.os: $(all-rtld-routines:%=$(objpfx)%.os) > # their implementation is provided differently in rtld, and the symbol > # discovery mechanism is not compatible with the libc implementation > # when compiled for libc. > -rtld-stubbed-symbols = > +rtld-stubbed-symbols = \ > + calloc \ > + free \ > + malloc \ > + realloc \ OK. > > # The GCC arguments that implement $(rtld-stubbed-symbols). > rtld-stubbed-symbols-args = \ > diff --git a/elf/Versions b/elf/Versions > index 3b09901f6c..705489fc51 100644 > --- a/elf/Versions > +++ b/elf/Versions > @@ -35,9 +35,6 @@ libc { > > ld { > GLIBC_2.0 { > - # Functions which are interposed from libc.so. > - calloc; free; malloc; realloc; Yay! > - > _r_debug; > } > GLIBC_2.1 { > diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c > index 378f28fa7d..12a229f06c 100644 > --- a/elf/dl-lookup.c > +++ b/elf/dl-lookup.c > @@ -291,7 +291,7 @@ do_lookup_unique (const char *undef_name, uint_fast32_t new_hash, > tab->size = newsize; > size = newsize; > entries = tab->entries = newentries; > - tab->free = free; > + tab->free = __rtld_free; OK. > } > } > else > @@ -322,7 +322,7 @@ do_lookup_unique (const char *undef_name, uint_fast32_t new_hash, > > tab->entries = entries; > tab->size = size; > - tab->free = free; > + tab->free = __rtld_free; OK. > } > > if ((type_class & ELF_RTYPE_CLASS_COPY) != 0) > diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c > index 42192f8a7b..c79ce23be4 100644 > --- a/elf/dl-minimal.c > +++ b/elf/dl-minimal.c > @@ -26,11 +26,87 @@ > #include <sys/param.h> > #include <sys/types.h> > #include <ldsodefs.h> > +#include <dl-irel.h> > +#include <dl-hash.h> > +#include <dl-sym-post.h> > #include <_itoa.h> > #include <malloc/malloc-internal.h> > > #include <assert.h> > > +/* The rtld startup code calls __rtld_malloc_init_stubs after the > + first self-relocation to adjust the pointers to the minimal > + implementation below. Before the final relocation, > + __rtld_malloc_init_real is called to replace the pointers with the > + real implementation. */ > +__typeof (calloc) *__rtld_calloc; > +__typeof (free) *__rtld_free; > +__typeof (malloc) *__rtld_malloc; > +__typeof (realloc) *__rtld_realloc; > + > +/* Defined below. */ > +static __typeof (calloc) rtld_calloc attribute_relro; > +static __typeof (free) rtld_free attribute_relro; > +static __typeof (malloc) rtld_malloc attribute_relro; > +static __typeof (realloc) rtld_realloc attribute_relro; > + > +void > +__rtld_malloc_init_stubs (void) > +{ > + __rtld_calloc = &rtld_calloc; > + __rtld_free = &rtld_free; > + __rtld_malloc = &rtld_malloc; > + __rtld_realloc = &rtld_realloc; > +} > + > +/* Lookup NAME at VERSION in the scope of MATCH. */ > +static void * > +lookup_malloc_symbol (struct link_map *main_map, const char *name, > + struct r_found_version *version) > +{ > + > + const ElfW(Sym) *ref = NULL; > + lookup_t result = _dl_lookup_symbol_x (name, main_map, &ref, > + main_map->l_scope, > + version, 0, 0, NULL); > + > + assert (ELFW(ST_TYPE) (ref->st_info) != STT_TLS); > + void *value = DL_SYMBOL_ADDRESS (result, ref); > + > + return _dl_sym_post (result, ref, value, 0, main_map); > +} > + > +void > +__rtld_malloc_init_real (struct link_map *main_map) > +{ > + /* We cannot use relocations and initializers for this because the > + changes made by __rtld_malloc_init_stubs break REL-style > + (non-RELA) relocations that depend on the previous pointer > + contents. Also avoid direct relocation depedencies for the > + malloc symbols so this function can be called before the final > + rtld relocation (which enables RELRO, after which the pointer > + variables cannot be written to). */ > + > + struct r_found_version version; > + version.name = symbol_version_string (libc, GLIBC_2_0); > + version.hidden = 0; > + version.hash = _dl_elf_hash (version.name); > + version.filename = NULL; > + > + void *new_calloc = lookup_malloc_symbol (main_map, "calloc", &version); > + void *new_free = lookup_malloc_symbol (main_map, "free", &version); > + void *new_malloc = lookup_malloc_symbol (main_map, "malloc", &version); > + void *new_realloc = lookup_malloc_symbol (main_map, "realloc", &version); > + > + /* Update the pointers in one go, so that any internal allocations > + performed by lookup_malloc_symbol see a consistent > + implementation. */ > + __rtld_calloc = new_calloc; > + __rtld_free = new_free; > + __rtld_malloc = new_malloc; > + __rtld_realloc = new_realloc; OK. Love this manual hand-off. > +} > + > /* Minimal malloc allocator for used during initial link. After the > initial link, a full malloc implementation is interposed, either > the one in libc, or a different one supplied by the user through > @@ -38,14 +114,9 @@ > > static void *alloc_ptr, *alloc_end, *alloc_last_block; > > -/* Declarations of global functions. */ > -extern void weak_function free (void *ptr); > -extern void * weak_function realloc (void *ptr, size_t n); > - > - > /* Allocate an aligned memory block. */ > -void * weak_function > -malloc (size_t n) > +static void * > +rtld_malloc (size_t n) > { > if (alloc_end == 0) > { > @@ -87,8 +158,8 @@ malloc (size_t n) > /* We use this function occasionally since the real implementation may > be optimized when it can assume the memory it returns already is > set to NUL. */ > -void * weak_function > -calloc (size_t nmemb, size_t size) > +static void * > +rtld_calloc (size_t nmemb, size_t size) > { > /* New memory from the trivial malloc above is always already cleared. > (We make sure that's true in the rare occasion it might not be, > @@ -104,8 +175,8 @@ calloc (size_t nmemb, size_t size) > } > > /* This will rarely be called. */ > -void weak_function > -free (void *ptr) > +void > +rtld_free (void *ptr) > { > /* We can free only the last block allocated. */ > if (ptr == alloc_last_block) > @@ -118,8 +189,8 @@ free (void *ptr) > } > > /* This is only called with the most recent block returned by malloc. */ > -void * weak_function > -realloc (void *ptr, size_t n) > +void * > +rtld_realloc (void *ptr, size_t n) > { > if (ptr == NULL) > return malloc (n); OK. > diff --git a/elf/rtld.c b/elf/rtld.c > index 553cfbd1b7..51dfaf966a 100644 > --- a/elf/rtld.c > +++ b/elf/rtld.c > @@ -534,6 +534,9 @@ _dl_start (void *arg) > header table in core. Put the rest of _dl_start into a separate > function, that way the compiler cannot put accesses to the GOT > before ELF_DYNAMIC_RELOCATE. */ > + > + __rtld_malloc_init_stubs (); OK. > + > { > #ifdef DONT_USE_BOOTSTRAP_MAP > ElfW(Addr) entry = _dl_start_final (arg); > @@ -2210,6 +2213,10 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]); > rtld_timer_stop (&relocate_time, start); > } > > + /* The library defining malloc has already been relocated due to > + prelinking. Resolve the malloc symbols for the dynamic > + loader. */ > + __rtld_malloc_init_real (main_map); OK. > > /* Mark all the objects so we know they have been already relocated. */ > for (struct link_map *l = main_map; l != NULL; l = l->l_next) > @@ -2310,6 +2317,11 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]); > re-relocation, we might call a user-supplied function > (e.g. calloc from _dl_relocate_object) that uses TLS data. */ > > + /* The malloc implementation has been relocated, so resolving > + its symbols (and potentially calling IFUNC resolvers) is safe > + at this point. */ > + __rtld_malloc_init_real (main_map); OK. > + > RTLD_TIMING_VAR (start); > rtld_timer_start (&start); > > diff --git a/include/inline-hashtab.h b/include/inline-hashtab.h > index 3c09978199..856719cf9d 100644 > --- a/include/inline-hashtab.h > +++ b/include/inline-hashtab.h > @@ -51,7 +51,7 @@ htab_create (void) > return NULL; > ht->size = 3; > ht->entries = malloc (sizeof (void *) * ht->size); > - ht->free = free; > + ht->free = __rtld_free; > if (! ht->entries) > { > free (ht); > @@ -167,7 +167,7 @@ htab_expand (struct hashtab *htab, int (*hash_fn) (void *)) > > /* Use the free() corresponding to the malloc() above to free this > up. */ > - htab->free = free; > + htab->free = __rtld_free; > > return 1; > } > diff --git a/include/libc-symbols.h b/include/libc-symbols.h > index 685e20fdc0..33e2d34c53 100644 > --- a/include/libc-symbols.h > +++ b/include/libc-symbols.h > @@ -421,7 +421,14 @@ for linking") > # define _default_symbol_version(real, name, version) \ > __asm__ (".symver " #real "," #name "@@" #version) > # endif > -#else > + > +/* Evalutes to a string literal for VERSION in LIB. */ > +# define symbol_version_string(lib, version) \ > + _symbol_version_stringify_1 (VERSION_##lib##_##version) > +# define _symbol_version_stringify_1(arg) _symbol_version_stringify_2 (arg) > +# define _symbol_version_stringify_2(arg) #arg > + > +#else /* !SHARED */ > # define symbol_version(real, name, version) > # define default_symbol_version(real, name, version) \ > strong_alias(real, name) > diff --git a/include/malloc.h b/include/malloc.h > index 70d32c7c84..0765482c51 100644 > --- a/include/malloc.h > +++ b/include/malloc.h > @@ -1,7 +1,9 @@ > #ifndef _MALLOC_H > + > #include <malloc/malloc.h> > > # ifndef _ISOMAC > +# include <rtld-malloc.h> > > /* In the GNU libc we rename the global variable > `__malloc_initialized' to `__libc_malloc_initialized'. */ > diff --git a/include/rtld-malloc.h b/include/rtld-malloc.h > new file mode 100644 > index 0000000000..b026a3270c > --- /dev/null > +++ b/include/rtld-malloc.h > @@ -0,0 +1,85 @@ > +/* Redirection of malloc inside the dynamic linker. > + Copyright (C) 2020 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <https://www.gnu.org/licenses/>. */ > + > +/* The dynamic linker needs to use its own minimal malloc before libc > + has been relocated, and the libc malloc afterwards. The active > + malloc implementation is reached via the __rtld_* function pointers > + declared below. They are initialized to the minimal malloc by > + __rtld_malloc_init_stubs, and set to the final implementation by > + __rtld_malloc_init_real. */ > + > +#ifndef _RTLD_MALLOC_H > +#define _RTLD_MALLOC_H > + > +#if IS_IN (rtld) > + > +extern __typeof (calloc) *__rtld_calloc attribute_hidden; > +extern __typeof (free) *__rtld_free attribute_hidden; > +extern __typeof (malloc) *__rtld_malloc attribute_hidden; > +extern __typeof (realloc) *__rtld_realloc attribute_hidden; > + > +/* Wrapper functions which call through the function pointers above. > + Note that it is not supported to take the address of those > + functions. Instead the function pointers must be used > + directly. */ > + > +__extern_inline void * > +calloc (size_t a, size_t b) > +{ > + return __rtld_calloc (a, b); > +} > + > +__extern_inline void > +free (void *ptr) > +{ > + __rtld_free (ptr); > +} > + > +__extern_inline void * > +malloc (size_t size) > +{ > + return __rtld_malloc (size); > +} > + > +__extern_inline void * > +realloc (void *ptr, size_t size) > +{ > + return __rtld_realloc (ptr, size); > +} > + > +/* Called after the first self-relocation to activate the minimal malloc > + implementation. */ > +void __rtld_malloc_init_stubs (void) attribute_hidden; > + > +/* Called shortly before the final self-relocation (when RELRO > + variables are still writable) to activate the real malloc > + implementation. MAIN_MAP is the link map of the executable. */ > +struct link_map; > +void __rtld_malloc_init_real (struct link_map *main_map) attribute_hidden; > + > +#else /* !IS_IN (rtld) */ > + > +/* This allows static/non-rtld builds to get a pointer to the > + functions, in the same way that is required inside rtld. */ > +# define __rtld_calloc (&calloc) > +# define __rtld_free (&free) > +# define __rtld_malloc (&malloc) > +# define __rtld_realloc (&realloc) > + > +#endif /* !IS_IN (rtld) */ > +#endif /* _RTLD_MALLOC_H */ OK. > diff --git a/include/stdlib.h b/include/stdlib.h > index 1fab78aa16..926f965f69 100644 > --- a/include/stdlib.h > +++ b/include/stdlib.h > @@ -9,6 +9,8 @@ > #if !defined _ISOMAC > # include <sys/stat.h> > > +# include <rtld-malloc.h> > + > extern __typeof (strtol_l) __strtol_l; > extern __typeof (strtoul_l) __strtoul_l; > extern __typeof (strtoll_l) __strtoll_l; > diff --git a/sysdeps/generic/localplt.data b/sysdeps/generic/localplt.data > index 2d5c66ae28..e2083c0ce6 100644 > --- a/sysdeps/generic/localplt.data > +++ b/sysdeps/generic/localplt.data > @@ -7,12 +7,6 @@ libc.so: malloc > libc.so: memalign > libc.so: realloc > libm.so: matherr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free OK. > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/mach/hurd/i386/ld.abilist b/sysdeps/mach/hurd/i386/ld.abilist > index c76b913486..6f591b2496 100644 > --- a/sysdeps/mach/hurd/i386/ld.abilist > +++ b/sysdeps/mach/hurd/i386/ld.abilist > @@ -16,10 +16,6 @@ GLIBC_2.2.6 _dl_mcount F > GLIBC_2.2.6 _hurd_intr_rpc_mach_msg F > GLIBC_2.2.6 _r_debug D 0x14 > GLIBC_2.2.6 abort F > -GLIBC_2.2.6 calloc F > -GLIBC_2.2.6 free F > -GLIBC_2.2.6 malloc F > -GLIBC_2.2.6 realloc F OK. > GLIBC_2.3 ___tls_get_addr F > GLIBC_2.3 __tls_get_addr F > GLIBC_2.4 __stack_chk_guard D 0x4 > diff --git a/sysdeps/mach/hurd/i386/localplt.data b/sysdeps/mach/hurd/i386/localplt.data > index c1725d140f..102323e64f 100644 > --- a/sysdeps/mach/hurd/i386/localplt.data > +++ b/sysdeps/mach/hurd/i386/localplt.data > @@ -9,12 +9,6 @@ libc.so: malloc + REL R_386_GLOB_DAT > libc.so: memalign + REL R_386_GLOB_DAT > libc.so: realloc + REL R_386_GLOB_DAT > libm.so: matherr + REL R_386_GLOB_DAT > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc + REL R_386_GLOB_DAT > -ld.so: calloc + REL R_386_GLOB_DAT > -ld.so: realloc + REL R_386_GLOB_DAT > -ld.so: free + REL R_386_GLOB_DAT > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error + REL R_386_GLOB_DAT > ld.so: _dl_catch_error + REL R_386_GLOB_DAT > diff --git a/sysdeps/unix/sysv/linux/aarch64/ld.abilist b/sysdeps/unix/sysv/linux/aarch64/ld.abilist > index 4ffe688649..80b2fe6725 100644 > --- a/sysdeps/unix/sysv/linux/aarch64/ld.abilist > +++ b/sysdeps/unix/sysv/linux/aarch64/ld.abilist > @@ -3,7 +3,3 @@ GLIBC_2.17 __stack_chk_guard D 0x8 > GLIBC_2.17 __tls_get_addr F > GLIBC_2.17 _dl_mcount F > GLIBC_2.17 _r_debug D 0x28 > -GLIBC_2.17 calloc F > -GLIBC_2.17 free F > -GLIBC_2.17 malloc F > -GLIBC_2.17 realloc F > diff --git a/sysdeps/unix/sysv/linux/aarch64/localplt.data b/sysdeps/unix/sysv/linux/aarch64/localplt.data > index a60053b914..56f362d3a7 100644 > --- a/sysdeps/unix/sysv/linux/aarch64/localplt.data > +++ b/sysdeps/unix/sysv/linux/aarch64/localplt.data > @@ -9,12 +9,6 @@ libc.so: realloc > libm.so: matherr > # The dynamic loader needs __tls_get_addr for TLS. > ld.so: __tls_get_addr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/alpha/ld.abilist b/sysdeps/unix/sysv/linux/alpha/ld.abilist > index 98b66edabf..98a03f611f 100644 > --- a/sysdeps/unix/sysv/linux/alpha/ld.abilist > +++ b/sysdeps/unix/sysv/linux/alpha/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.0 _r_debug D 0x28 > -GLIBC_2.0 calloc F > -GLIBC_2.0 free F > -GLIBC_2.0 malloc F > -GLIBC_2.0 realloc F > GLIBC_2.1 __libc_stack_end D 0x8 > GLIBC_2.1 _dl_mcount F > GLIBC_2.3 __tls_get_addr F > diff --git a/sysdeps/unix/sysv/linux/alpha/localplt.data b/sysdeps/unix/sysv/linux/alpha/localplt.data > index c69eb04ce5..43f6fdaea1 100644 > --- a/sysdeps/unix/sysv/linux/alpha/localplt.data > +++ b/sysdeps/unix/sysv/linux/alpha/localplt.data > @@ -26,12 +26,6 @@ libm.so: matherr + RELA R_ALPHA_GLOB_DAT > libm.so: __atan2 > # The dynamic loader needs __tls_get_addr for TLS. > ld.so: __tls_get_addr ? > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc + RELA R_ALPHA_GLOB_DAT > -ld.so: calloc + RELA R_ALPHA_GLOB_DAT > -ld.so: realloc + RELA R_ALPHA_GLOB_DAT > -ld.so: free + RELA R_ALPHA_GLOB_DAT > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error + RELA R_ALPHA_GLOB_DAT > ld.so: _dl_catch_error + RELA R_ALPHA_GLOB_DAT > diff --git a/sysdeps/unix/sysv/linux/arm/be/ld.abilist b/sysdeps/unix/sysv/linux/arm/be/ld.abilist > index a301c6ebc4..cc8825c3bc 100644 > --- a/sysdeps/unix/sysv/linux/arm/be/ld.abilist > +++ b/sysdeps/unix/sysv/linux/arm/be/ld.abilist > @@ -3,7 +3,3 @@ GLIBC_2.4 __stack_chk_guard D 0x4 > GLIBC_2.4 __tls_get_addr F > GLIBC_2.4 _dl_mcount F > GLIBC_2.4 _r_debug D 0x14 > -GLIBC_2.4 calloc F > -GLIBC_2.4 free F > -GLIBC_2.4 malloc F > -GLIBC_2.4 realloc F > diff --git a/sysdeps/unix/sysv/linux/arm/le/ld.abilist b/sysdeps/unix/sysv/linux/arm/le/ld.abilist > index a301c6ebc4..cc8825c3bc 100644 > --- a/sysdeps/unix/sysv/linux/arm/le/ld.abilist > +++ b/sysdeps/unix/sysv/linux/arm/le/ld.abilist > @@ -3,7 +3,3 @@ GLIBC_2.4 __stack_chk_guard D 0x4 > GLIBC_2.4 __tls_get_addr F > GLIBC_2.4 _dl_mcount F > GLIBC_2.4 _r_debug D 0x14 > -GLIBC_2.4 calloc F > -GLIBC_2.4 free F > -GLIBC_2.4 malloc F > -GLIBC_2.4 realloc F > diff --git a/sysdeps/unix/sysv/linux/arm/localplt.data b/sysdeps/unix/sysv/linux/arm/localplt.data > index 7bd541c28a..0c3af0c64e 100644 > --- a/sysdeps/unix/sysv/linux/arm/localplt.data > +++ b/sysdeps/unix/sysv/linux/arm/localplt.data > @@ -8,12 +8,6 @@ libm.so: matherr > libpthread.so: raise > # The dynamic loader needs __tls_get_addr for TLS. > ld.so: __tls_get_addr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/csky/ld.abilist b/sysdeps/unix/sysv/linux/csky/ld.abilist > index 71576160ed..564ac09737 100644 > --- a/sysdeps/unix/sysv/linux/csky/ld.abilist > +++ b/sysdeps/unix/sysv/linux/csky/ld.abilist > @@ -3,7 +3,3 @@ GLIBC_2.29 __stack_chk_guard D 0x4 > GLIBC_2.29 __tls_get_addr F > GLIBC_2.29 _dl_mcount F > GLIBC_2.29 _r_debug D 0x14 > -GLIBC_2.29 calloc F > -GLIBC_2.29 free F > -GLIBC_2.29 malloc F > -GLIBC_2.29 realloc F > diff --git a/sysdeps/unix/sysv/linux/csky/localplt.data b/sysdeps/unix/sysv/linux/csky/localplt.data > index 14c02cb2d6..0ed8650b65 100644 > --- a/sysdeps/unix/sysv/linux/csky/localplt.data > +++ b/sysdeps/unix/sysv/linux/csky/localplt.data > @@ -6,12 +6,6 @@ libc.so: free > libc.so: malloc > libc.so: memalign > libc.so: realloc > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/hppa/ld.abilist b/sysdeps/unix/sysv/linux/hppa/ld.abilist > index 0387614d8f..d155a59843 100644 > --- a/sysdeps/unix/sysv/linux/hppa/ld.abilist > +++ b/sysdeps/unix/sysv/linux/hppa/ld.abilist > @@ -1,9 +1,5 @@ > GLIBC_2.2 __libc_stack_end D 0x4 > GLIBC_2.2 _dl_mcount F > GLIBC_2.2 _r_debug D 0x14 > -GLIBC_2.2 calloc F > -GLIBC_2.2 free F > -GLIBC_2.2 malloc F > -GLIBC_2.2 realloc F > GLIBC_2.3 __tls_get_addr F > GLIBC_2.4 __stack_chk_guard D 0x4 > diff --git a/sysdeps/unix/sysv/linux/hppa/localplt.data b/sysdeps/unix/sysv/linux/hppa/localplt.data > index 867413f0c5..09893d4dcf 100644 > --- a/sysdeps/unix/sysv/linux/hppa/localplt.data > +++ b/sysdeps/unix/sysv/linux/hppa/localplt.data > @@ -10,12 +10,6 @@ libc.so: __sigsetjmp > libc.so: _IO_funlockfile > libc.so: __errno_location > libm.so: matherr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/i386/ld.abilist b/sysdeps/unix/sysv/linux/i386/ld.abilist > index edb7307228..0478e22071 100644 > --- a/sysdeps/unix/sysv/linux/i386/ld.abilist > +++ b/sysdeps/unix/sysv/linux/i386/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.0 _r_debug D 0x14 > -GLIBC_2.0 calloc F > -GLIBC_2.0 free F > -GLIBC_2.0 malloc F > -GLIBC_2.0 realloc F > GLIBC_2.1 __libc_stack_end D 0x4 > GLIBC_2.1 _dl_mcount F > GLIBC_2.3 ___tls_get_addr F > diff --git a/sysdeps/unix/sysv/linux/i386/localplt.data b/sysdeps/unix/sysv/linux/i386/localplt.data > index f6f20a5d15..5334875b4b 100644 > --- a/sysdeps/unix/sysv/linux/i386/localplt.data > +++ b/sysdeps/unix/sysv/linux/i386/localplt.data > @@ -7,12 +7,6 @@ libc.so: malloc + REL R_386_GLOB_DAT > libc.so: memalign + REL R_386_GLOB_DAT > libc.so: realloc + REL R_386_GLOB_DAT > libm.so: matherr + REL R_386_GLOB_DAT > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc + REL R_386_GLOB_DAT > -ld.so: calloc + REL R_386_GLOB_DAT > -ld.so: realloc + REL R_386_GLOB_DAT > -ld.so: free + REL R_386_GLOB_DAT > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error + REL R_386_GLOB_DAT > ld.so: _dl_catch_error + REL R_386_GLOB_DAT > diff --git a/sysdeps/unix/sysv/linux/ia64/ld.abilist b/sysdeps/unix/sysv/linux/ia64/ld.abilist > index 82042472c3..33f91199bf 100644 > --- a/sysdeps/unix/sysv/linux/ia64/ld.abilist > +++ b/sysdeps/unix/sysv/linux/ia64/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.2 __libc_stack_end D 0x8 > GLIBC_2.2 _dl_mcount F > GLIBC_2.2 _r_debug D 0x28 > -GLIBC_2.2 calloc F > -GLIBC_2.2 free F > -GLIBC_2.2 malloc F > -GLIBC_2.2 realloc F > GLIBC_2.3 __tls_get_addr F > diff --git a/sysdeps/unix/sysv/linux/ia64/localplt.data b/sysdeps/unix/sysv/linux/ia64/localplt.data > index 3820e2a4e6..1c566a503e 100644 > --- a/sysdeps/unix/sysv/linux/ia64/localplt.data > +++ b/sysdeps/unix/sysv/linux/ia64/localplt.data > @@ -6,12 +6,6 @@ libc.so: realloc > libm.so: matherr > libm.so: matherrf > libm.so: matherrl > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/ld.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/ld.abilist > index a301c6ebc4..cc8825c3bc 100644 > --- a/sysdeps/unix/sysv/linux/m68k/coldfire/ld.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/ld.abilist > @@ -3,7 +3,3 @@ GLIBC_2.4 __stack_chk_guard D 0x4 > GLIBC_2.4 __tls_get_addr F > GLIBC_2.4 _dl_mcount F > GLIBC_2.4 _r_debug D 0x14 > -GLIBC_2.4 calloc F > -GLIBC_2.4 free F > -GLIBC_2.4 malloc F > -GLIBC_2.4 realloc F > diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data > index 4a07bf387e..3c5efb7204 100644 > --- a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data > +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data > @@ -5,12 +5,6 @@ libc.so: malloc > libc.so: memalign > libc.so: realloc > libm.so: matherr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/ld.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/ld.abilist > index c9ec45cf1c..3ba474c27f 100644 > --- a/sysdeps/unix/sysv/linux/m68k/m680x0/ld.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.0 _r_debug D 0x14 > -GLIBC_2.0 calloc F > -GLIBC_2.0 free F > -GLIBC_2.0 malloc F > -GLIBC_2.0 realloc F > GLIBC_2.1 __libc_stack_end D 0x4 > GLIBC_2.1 _dl_mcount F > GLIBC_2.3 __tls_get_addr F > diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data > index c70d6ea301..843f4e25f2 100644 > --- a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data > +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data > @@ -6,12 +6,6 @@ libc.so: malloc > libc.so: memalign > libc.so: realloc > libm.so: matherr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/microblaze/ld.abilist b/sysdeps/unix/sysv/linux/microblaze/ld.abilist > index aa0d71150a..a4933c3541 100644 > --- a/sysdeps/unix/sysv/linux/microblaze/ld.abilist > +++ b/sysdeps/unix/sysv/linux/microblaze/ld.abilist > @@ -3,7 +3,3 @@ GLIBC_2.18 __stack_chk_guard D 0x4 > GLIBC_2.18 __tls_get_addr F > GLIBC_2.18 _dl_mcount F > GLIBC_2.18 _r_debug D 0x14 > -GLIBC_2.18 calloc F > -GLIBC_2.18 free F > -GLIBC_2.18 malloc F > -GLIBC_2.18 realloc F > diff --git a/sysdeps/unix/sysv/linux/microblaze/localplt.data b/sysdeps/unix/sysv/linux/microblaze/localplt.data > index 8ca23897df..0e98d5251e 100644 > --- a/sysdeps/unix/sysv/linux/microblaze/localplt.data > +++ b/sysdeps/unix/sysv/linux/microblaze/localplt.data > @@ -7,12 +7,6 @@ libc.so: realloc > libm.so: matherr > # The dynamic loader needs __tls_get_addr for TLS. > ld.so: __tls_get_addr ? > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/ld.abilist b/sysdeps/unix/sysv/linux/mips/mips32/ld.abilist > index 55d48868e8..be09641a48 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips32/ld.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips32/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.0 _r_debug D 0x14 > -GLIBC_2.0 calloc F > -GLIBC_2.0 free F > -GLIBC_2.0 malloc F > -GLIBC_2.0 realloc F > GLIBC_2.2 __libc_stack_end D 0x4 > GLIBC_2.2 _dl_mcount F > GLIBC_2.3 __tls_get_addr F > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/ld.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/ld.abilist > index 55d48868e8..be09641a48 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/ld.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.0 _r_debug D 0x14 > -GLIBC_2.0 calloc F > -GLIBC_2.0 free F > -GLIBC_2.0 malloc F > -GLIBC_2.0 realloc F > GLIBC_2.2 __libc_stack_end D 0x4 > GLIBC_2.2 _dl_mcount F > GLIBC_2.3 __tls_get_addr F > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist > index 44b345b7cf..1ea36e13f2 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.0 _r_debug D 0x28 > -GLIBC_2.0 calloc F > -GLIBC_2.0 free F > -GLIBC_2.0 malloc F > -GLIBC_2.0 realloc F > GLIBC_2.2 __libc_stack_end D 0x8 > GLIBC_2.2 _dl_mcount F > GLIBC_2.3 __tls_get_addr F > diff --git a/sysdeps/unix/sysv/linux/nios2/ld.abilist b/sysdeps/unix/sysv/linux/nios2/ld.abilist > index 110f1039fa..52178802dd 100644 > --- a/sysdeps/unix/sysv/linux/nios2/ld.abilist > +++ b/sysdeps/unix/sysv/linux/nios2/ld.abilist > @@ -3,7 +3,3 @@ GLIBC_2.21 __stack_chk_guard D 0x4 > GLIBC_2.21 __tls_get_addr F > GLIBC_2.21 _dl_mcount F > GLIBC_2.21 _r_debug D 0x14 > -GLIBC_2.21 calloc F > -GLIBC_2.21 free F > -GLIBC_2.21 malloc F > -GLIBC_2.21 realloc F > diff --git a/sysdeps/unix/sysv/linux/nios2/localplt.data b/sysdeps/unix/sysv/linux/nios2/localplt.data > index 3805ed56b9..b37987c7c0 100644 > --- a/sysdeps/unix/sysv/linux/nios2/localplt.data > +++ b/sysdeps/unix/sysv/linux/nios2/localplt.data > @@ -28,12 +28,6 @@ libc.so: __eqdf2 > libc.so: __extendsfdf2 > libc.so: __floatundidf ? > libm.so: matherr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data > index e822e0a480..a02dd5cc24 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data > @@ -5,12 +5,6 @@ libc.so: malloc > libc.so: memalign > libc.so: realloc > libm.so: matherr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist > index e8b0ea3a9b..4bbfba7a61 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.0 _r_debug D 0x14 > -GLIBC_2.0 calloc F > -GLIBC_2.0 free F > -GLIBC_2.0 malloc F > -GLIBC_2.0 realloc F > GLIBC_2.1 __libc_stack_end D 0x4 > GLIBC_2.1 _dl_mcount F > GLIBC_2.22 __tls_get_addr_opt F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data > index 647e735fdf..d8072597b7 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data > @@ -36,12 +36,6 @@ libc.so: realloc > libm.so: copysignl ? > libm.so: fabsl > libm.so: matherr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist > index edfc9ca56f..283fb4510b 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist > @@ -4,7 +4,3 @@ GLIBC_2.3 __libc_stack_end D 0x8 > GLIBC_2.3 __tls_get_addr F > GLIBC_2.3 _dl_mcount F > GLIBC_2.3 _r_debug D 0x28 > -GLIBC_2.3 calloc F > -GLIBC_2.3 free F > -GLIBC_2.3 malloc F > -GLIBC_2.3 realloc F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist > index 37c8f6684b..b1f313c7cd 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist > @@ -2,9 +2,5 @@ GLIBC_2.17 __libc_stack_end D 0x8 > GLIBC_2.17 __tls_get_addr F > GLIBC_2.17 _dl_mcount F > GLIBC_2.17 _r_debug D 0x28 > -GLIBC_2.17 calloc F > -GLIBC_2.17 free F > -GLIBC_2.17 malloc F > -GLIBC_2.17 realloc F > GLIBC_2.22 __tls_get_addr_opt F > GLIBC_2.23 __parse_hwcap_and_convert_at_platform F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data > index c1209336d2..bb498fbe3a 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data > @@ -4,12 +4,6 @@ libc.so: malloc > libc.so: memalign > libc.so: realloc > libm.so: matherr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/riscv/localplt.data b/sysdeps/unix/sysv/linux/riscv/localplt.data > index 14c02cb2d6..0ed8650b65 100644 > --- a/sysdeps/unix/sysv/linux/riscv/localplt.data > +++ b/sysdeps/unix/sysv/linux/riscv/localplt.data > @@ -6,12 +6,6 @@ libc.so: free > libc.so: malloc > libc.so: memalign > libc.so: realloc > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist > index b411871d06..845f356c3c 100644 > --- a/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist > +++ b/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist > @@ -3,7 +3,3 @@ GLIBC_2.27 __stack_chk_guard D 0x8 > GLIBC_2.27 __tls_get_addr F > GLIBC_2.27 _dl_mcount F > GLIBC_2.27 _r_debug D 0x28 > -GLIBC_2.27 calloc F > -GLIBC_2.27 free F > -GLIBC_2.27 malloc F > -GLIBC_2.27 realloc F > diff --git a/sysdeps/unix/sysv/linux/s390/localplt.data b/sysdeps/unix/sysv/linux/s390/localplt.data > index e822e0a480..a02dd5cc24 100644 > --- a/sysdeps/unix/sysv/linux/s390/localplt.data > +++ b/sysdeps/unix/sysv/linux/s390/localplt.data > @@ -5,12 +5,6 @@ libc.so: malloc > libc.so: memalign > libc.so: realloc > libm.so: matherr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/ld.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/ld.abilist > index 0576c9575e..b56f005beb 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-32/ld.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-32/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.0 _r_debug D 0x14 > -GLIBC_2.0 calloc F > -GLIBC_2.0 free F > -GLIBC_2.0 malloc F > -GLIBC_2.0 realloc F > GLIBC_2.1 __libc_stack_end D 0x4 > GLIBC_2.1 _dl_mcount F > GLIBC_2.3 __tls_get_offset F > diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist > index 1fbb890d1d..6f788a086d 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.2 __libc_stack_end D 0x8 > GLIBC_2.2 _dl_mcount F > GLIBC_2.2 _r_debug D 0x28 > -GLIBC_2.2 calloc F > -GLIBC_2.2 free F > -GLIBC_2.2 malloc F > -GLIBC_2.2 realloc F > GLIBC_2.3 __tls_get_offset F > diff --git a/sysdeps/unix/sysv/linux/sh/be/ld.abilist b/sysdeps/unix/sysv/linux/sh/be/ld.abilist > index 0387614d8f..d155a59843 100644 > --- a/sysdeps/unix/sysv/linux/sh/be/ld.abilist > +++ b/sysdeps/unix/sysv/linux/sh/be/ld.abilist > @@ -1,9 +1,5 @@ > GLIBC_2.2 __libc_stack_end D 0x4 > GLIBC_2.2 _dl_mcount F > GLIBC_2.2 _r_debug D 0x14 > -GLIBC_2.2 calloc F > -GLIBC_2.2 free F > -GLIBC_2.2 malloc F > -GLIBC_2.2 realloc F > GLIBC_2.3 __tls_get_addr F > GLIBC_2.4 __stack_chk_guard D 0x4 > diff --git a/sysdeps/unix/sysv/linux/sh/le/ld.abilist b/sysdeps/unix/sysv/linux/sh/le/ld.abilist > index 0387614d8f..d155a59843 100644 > --- a/sysdeps/unix/sysv/linux/sh/le/ld.abilist > +++ b/sysdeps/unix/sysv/linux/sh/le/ld.abilist > @@ -1,9 +1,5 @@ > GLIBC_2.2 __libc_stack_end D 0x4 > GLIBC_2.2 _dl_mcount F > GLIBC_2.2 _r_debug D 0x14 > -GLIBC_2.2 calloc F > -GLIBC_2.2 free F > -GLIBC_2.2 malloc F > -GLIBC_2.2 realloc F > GLIBC_2.3 __tls_get_addr F > GLIBC_2.4 __stack_chk_guard D 0x4 > diff --git a/sysdeps/unix/sysv/linux/sh/localplt.data b/sysdeps/unix/sysv/linux/sh/localplt.data > index babb19d717..3225177c50 100644 > --- a/sysdeps/unix/sysv/linux/sh/localplt.data > +++ b/sysdeps/unix/sysv/linux/sh/localplt.data > @@ -12,12 +12,6 @@ libc.so: __errno_location > libm.so: matherr > # Generated by the compiler because there is no trap insn pattern. > libc.so: abort ? > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/ld.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/ld.abilist > index fd0b33f86d..0c6610e3c2 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc32/ld.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.0 _r_debug D 0x14 > -GLIBC_2.0 calloc F > -GLIBC_2.0 free F > -GLIBC_2.0 malloc F > -GLIBC_2.0 realloc F > GLIBC_2.1 __libc_stack_end D 0x4 > GLIBC_2.1 _dl_mcount F > GLIBC_2.3 __tls_get_addr F > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data > index 6bf10ff858..be51efd566 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data > +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data > @@ -19,12 +19,6 @@ libc.so: malloc > libc.so: memalign > libc.so: realloc > libm.so: matherr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist > index 82042472c3..33f91199bf 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.2 __libc_stack_end D 0x8 > GLIBC_2.2 _dl_mcount F > GLIBC_2.2 _r_debug D 0x28 > -GLIBC_2.2 calloc F > -GLIBC_2.2 free F > -GLIBC_2.2 malloc F > -GLIBC_2.2 realloc F > GLIBC_2.3 __tls_get_addr F > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data > index b881b9096d..809062d46c 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data > +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data > @@ -18,12 +18,6 @@ libc.so: malloc > libc.so: memalign > libc.so: realloc > libm.so: matherr > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc > -ld.so: calloc > -ld.so: realloc > -ld.so: free > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error > ld.so: _dl_catch_error > diff --git a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist > index 0dc9430611..d3cdf7611e 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist > @@ -1,8 +1,4 @@ > GLIBC_2.2.5 __libc_stack_end D 0x8 > GLIBC_2.2.5 _dl_mcount F > GLIBC_2.2.5 _r_debug D 0x28 > -GLIBC_2.2.5 calloc F > -GLIBC_2.2.5 free F > -GLIBC_2.2.5 malloc F > -GLIBC_2.2.5 realloc F > GLIBC_2.3 __tls_get_addr F > diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist > index 80f3161586..c70bccf782 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist > @@ -2,7 +2,3 @@ GLIBC_2.16 __libc_stack_end D 0x4 > GLIBC_2.16 __tls_get_addr F > GLIBC_2.16 _dl_mcount F > GLIBC_2.16 _r_debug D 0x14 > -GLIBC_2.16 calloc F > -GLIBC_2.16 free F > -GLIBC_2.16 malloc F > -GLIBC_2.16 realloc F > diff --git a/sysdeps/x86_64/localplt.data b/sysdeps/x86_64/localplt.data > index c27a02b66a..8f41e92870 100644 > --- a/sysdeps/x86_64/localplt.data > +++ b/sysdeps/x86_64/localplt.data > @@ -9,12 +9,6 @@ libc.so: malloc + RELA R_X86_64_GLOB_DAT > libc.so: memalign + RELA R_X86_64_GLOB_DAT > libc.so: realloc + RELA R_X86_64_GLOB_DAT > libm.so: matherr + RELA R_X86_64_GLOB_DAT > -# The main malloc is interposed into the dynamic linker, for > -# allocations after the initial link (when dlopen is used). > -ld.so: malloc + RELA R_X86_64_GLOB_DAT > -ld.so: calloc + RELA R_X86_64_GLOB_DAT > -ld.so: realloc + RELA R_X86_64_GLOB_DAT > -ld.so: free + RELA R_X86_64_GLOB_DAT > # The TLS-enabled version of these functions is interposed from libc.so. > ld.so: _dl_signal_error + RELA R_X86_64_GLOB_DAT > ld.so: _dl_catch_error + RELA R_X86_64_GLOB_DAT >
* Florian Weimer: > Exporting functions and relying on symbol interposition from libc.so > makes the choice of implementation dependent on DT_NEEDED order, which > is not what some compiler drivers expect. > > This commit replaces one magic mechanism (symbol interposition) with > another one (preprocessor-/compiler-based redirection). This makes > the hand-over from the minimal malloc to the full malloc more > explicit. > > Removing the ABI symbols is backwards-compatible because libc.so is > always in scope, and the dynamic loader will find the malloc-related > symbols there since commit f0b2132b35248c1f4a80f62a2c38cddcc802aa8c > ("ld.so: Support moving versioned symbols between sonames > [BZ #24741]"). > > Tested on aarch64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, > s390x-linux-gnu without the stack protector, and on x86_64-linux-gnu > with stack-protector-strong. Also built with build-many-glibcs.py. This commit breaks valgrind because it can no longer interpose the early malloc, leading to tons of errors on at least aarch64: ==801990== Command: /root/build/elf/ld-linux-aarch64.so.1 --library-path /root/build:/root/build/math:/root/build/elf:/root/build/dlfcn:/root/build/nss:/root/build/nis:/root/build/rt:/root/build/resolv:/root/build/mathvec:/root/build/support:/root/build/crypt:/root/build/nptl /bin/true --help ==801990== ==801990== Conditional jump or move depends on uninitialised value(s) ==801990== at 0x197EA8: ??? (in /root/build/elf/ld.so) ==801990== And this goes on and on. There's no stack trace here, so it's difficult to pin down. (The toolchain used for this build is supposed to build everything with -fasynchronous-unwind-tables, so I'm not sure why there's no backtrace.) I believe the location is in the index function: 0000000000017e10 <index>: 17e10: mov w4, #0x401 // #1025 17e14: movk w4, #0x4010, lsl #16 17e18: dup v0.16b, w1 17e1c: and x2, x0, #0xffffffffffffffe0 17e20: dup v16.4s, w4 17e24: ands x3, x0, #0x1f 17e28: add v7.4s, v16.4s, v16.4s 17e2c: b.eq 17e80 <index+0x70> // b.none 17e30: ld1 {v1.16b, v2.16b}, [x2], #32 17e34: neg x3, x3 17e38: cmeq v3.16b, v1.16b, #0 17e3c: cmeq v5.16b, v1.16b, v0.16b 17e40: cmeq v4.16b, v2.16b, #0 17e44: cmeq v6.16b, v2.16b, v0.16b 17e48: and v3.16b, v3.16b, v7.16b 17e4c: and v4.16b, v4.16b, v7.16b 17e50: and v5.16b, v5.16b, v16.16b 17e54: and v6.16b, v6.16b, v16.16b 17e58: orr v17.16b, v3.16b, v5.16b 17e5c: orr v18.16b, v4.16b, v6.16b 17e60: lsl x3, x3, #1 17e64: addp v17.16b, v17.16b, v18.16b 17e68: mov x5, #0xffffffffffffffff // #-1 17e6c: addp v17.16b, v17.16b, v18.16b 17e70: lsr x3, x5, x3 17e74: mov x5, v17.d[0] 17e78: bic x3, x5, x3 17e7c: cbnz x3, 17ed0 <index+0xc0> 17e80: ld1 {v1.16b, v2.16b}, [x2], #32 17e84: cmeq v3.16b, v1.16b, #0 17e88: cmeq v5.16b, v1.16b, v0.16b 17e8c: cmeq v4.16b, v2.16b, #0 17e90: cmeq v6.16b, v2.16b, v0.16b 17e94: orr v17.16b, v3.16b, v5.16b 17e98: orr v18.16b, v4.16b, v6.16b 17e9c: orr v17.16b, v17.16b, v18.16b 17ea0: addp v17.2d, v17.2d, v17.2d 17ea4: mov x3, v17.d[0] 17ea8: cbz x3, 17e80 <index+0x70> 17eac: and v3.16b, v3.16b, v7.16b 17eb0: and v4.16b, v4.16b, v7.16b 17eb4: and v5.16b, v5.16b, v16.16b 17eb8: and v6.16b, v6.16b, v16.16b 17ebc: orr v17.16b, v3.16b, v5.16b 17ec0: orr v18.16b, v4.16b, v6.16b 17ec4: addp v17.16b, v17.16b, v18.16b 17ec8: addp v17.16b, v17.16b, v18.16b 17ecc: mov x3, v17.d[0] 17ed0: sub x2, x2, #0x20 17ed4: rbit x3, x3 17ed8: clz x3, x3 17edc: tst x3, #0x1 17ee0: add x0, x2, x3, lsr #1 17ee4: csel x0, x0, xzr, eq // eq = none 17ee8: ret I don't know why valgrind would think the memory is undefined at this point. Thanks, Florian
diff --git a/elf/Makefile b/elf/Makefile index 60c8082d06..74462a5e65 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -486,7 +486,11 @@ $(objpfx)dl-allobjs.os: $(all-rtld-routines:%=$(objpfx)%.os) # their implementation is provided differently in rtld, and the symbol # discovery mechanism is not compatible with the libc implementation # when compiled for libc. -rtld-stubbed-symbols = +rtld-stubbed-symbols = \ + calloc \ + free \ + malloc \ + realloc \ # The GCC arguments that implement $(rtld-stubbed-symbols). rtld-stubbed-symbols-args = \ diff --git a/elf/Versions b/elf/Versions index 3b09901f6c..705489fc51 100644 --- a/elf/Versions +++ b/elf/Versions @@ -35,9 +35,6 @@ libc { ld { GLIBC_2.0 { - # Functions which are interposed from libc.so. - calloc; free; malloc; realloc; - _r_debug; } GLIBC_2.1 { diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 378f28fa7d..12a229f06c 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -291,7 +291,7 @@ do_lookup_unique (const char *undef_name, uint_fast32_t new_hash, tab->size = newsize; size = newsize; entries = tab->entries = newentries; - tab->free = free; + tab->free = __rtld_free; } } else @@ -322,7 +322,7 @@ do_lookup_unique (const char *undef_name, uint_fast32_t new_hash, tab->entries = entries; tab->size = size; - tab->free = free; + tab->free = __rtld_free; } if ((type_class & ELF_RTYPE_CLASS_COPY) != 0) diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c index 42192f8a7b..c79ce23be4 100644 --- a/elf/dl-minimal.c +++ b/elf/dl-minimal.c @@ -26,11 +26,87 @@ #include <sys/param.h> #include <sys/types.h> #include <ldsodefs.h> +#include <dl-irel.h> +#include <dl-hash.h> +#include <dl-sym-post.h> #include <_itoa.h> #include <malloc/malloc-internal.h> #include <assert.h> +/* The rtld startup code calls __rtld_malloc_init_stubs after the + first self-relocation to adjust the pointers to the minimal + implementation below. Before the final relocation, + __rtld_malloc_init_real is called to replace the pointers with the + real implementation. */ +__typeof (calloc) *__rtld_calloc; +__typeof (free) *__rtld_free; +__typeof (malloc) *__rtld_malloc; +__typeof (realloc) *__rtld_realloc; + +/* Defined below. */ +static __typeof (calloc) rtld_calloc attribute_relro; +static __typeof (free) rtld_free attribute_relro; +static __typeof (malloc) rtld_malloc attribute_relro; +static __typeof (realloc) rtld_realloc attribute_relro; + +void +__rtld_malloc_init_stubs (void) +{ + __rtld_calloc = &rtld_calloc; + __rtld_free = &rtld_free; + __rtld_malloc = &rtld_malloc; + __rtld_realloc = &rtld_realloc; +} + +/* Lookup NAME at VERSION in the scope of MATCH. */ +static void * +lookup_malloc_symbol (struct link_map *main_map, const char *name, + struct r_found_version *version) +{ + + const ElfW(Sym) *ref = NULL; + lookup_t result = _dl_lookup_symbol_x (name, main_map, &ref, + main_map->l_scope, + version, 0, 0, NULL); + + assert (ELFW(ST_TYPE) (ref->st_info) != STT_TLS); + void *value = DL_SYMBOL_ADDRESS (result, ref); + + return _dl_sym_post (result, ref, value, 0, main_map); +} + +void +__rtld_malloc_init_real (struct link_map *main_map) +{ + /* We cannot use relocations and initializers for this because the + changes made by __rtld_malloc_init_stubs break REL-style + (non-RELA) relocations that depend on the previous pointer + contents. Also avoid direct relocation depedencies for the + malloc symbols so this function can be called before the final + rtld relocation (which enables RELRO, after which the pointer + variables cannot be written to). */ + + struct r_found_version version; + version.name = symbol_version_string (libc, GLIBC_2_0); + version.hidden = 0; + version.hash = _dl_elf_hash (version.name); + version.filename = NULL; + + void *new_calloc = lookup_malloc_symbol (main_map, "calloc", &version); + void *new_free = lookup_malloc_symbol (main_map, "free", &version); + void *new_malloc = lookup_malloc_symbol (main_map, "malloc", &version); + void *new_realloc = lookup_malloc_symbol (main_map, "realloc", &version); + + /* Update the pointers in one go, so that any internal allocations + performed by lookup_malloc_symbol see a consistent + implementation. */ + __rtld_calloc = new_calloc; + __rtld_free = new_free; + __rtld_malloc = new_malloc; + __rtld_realloc = new_realloc; +} + /* Minimal malloc allocator for used during initial link. After the initial link, a full malloc implementation is interposed, either the one in libc, or a different one supplied by the user through @@ -38,14 +114,9 @@ static void *alloc_ptr, *alloc_end, *alloc_last_block; -/* Declarations of global functions. */ -extern void weak_function free (void *ptr); -extern void * weak_function realloc (void *ptr, size_t n); - - /* Allocate an aligned memory block. */ -void * weak_function -malloc (size_t n) +static void * +rtld_malloc (size_t n) { if (alloc_end == 0) { @@ -87,8 +158,8 @@ malloc (size_t n) /* We use this function occasionally since the real implementation may be optimized when it can assume the memory it returns already is set to NUL. */ -void * weak_function -calloc (size_t nmemb, size_t size) +static void * +rtld_calloc (size_t nmemb, size_t size) { /* New memory from the trivial malloc above is always already cleared. (We make sure that's true in the rare occasion it might not be, @@ -104,8 +175,8 @@ calloc (size_t nmemb, size_t size) } /* This will rarely be called. */ -void weak_function -free (void *ptr) +void +rtld_free (void *ptr) { /* We can free only the last block allocated. */ if (ptr == alloc_last_block) @@ -118,8 +189,8 @@ free (void *ptr) } /* This is only called with the most recent block returned by malloc. */ -void * weak_function -realloc (void *ptr, size_t n) +void * +rtld_realloc (void *ptr, size_t n) { if (ptr == NULL) return malloc (n); diff --git a/elf/rtld.c b/elf/rtld.c index 553cfbd1b7..51dfaf966a 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -534,6 +534,9 @@ _dl_start (void *arg) header table in core. Put the rest of _dl_start into a separate function, that way the compiler cannot put accesses to the GOT before ELF_DYNAMIC_RELOCATE. */ + + __rtld_malloc_init_stubs (); + { #ifdef DONT_USE_BOOTSTRAP_MAP ElfW(Addr) entry = _dl_start_final (arg); @@ -2210,6 +2213,10 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]); rtld_timer_stop (&relocate_time, start); } + /* The library defining malloc has already been relocated due to + prelinking. Resolve the malloc symbols for the dynamic + loader. */ + __rtld_malloc_init_real (main_map); /* Mark all the objects so we know they have been already relocated. */ for (struct link_map *l = main_map; l != NULL; l = l->l_next) @@ -2310,6 +2317,11 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]); re-relocation, we might call a user-supplied function (e.g. calloc from _dl_relocate_object) that uses TLS data. */ + /* The malloc implementation has been relocated, so resolving + its symbols (and potentially calling IFUNC resolvers) is safe + at this point. */ + __rtld_malloc_init_real (main_map); + RTLD_TIMING_VAR (start); rtld_timer_start (&start); diff --git a/include/inline-hashtab.h b/include/inline-hashtab.h index 3c09978199..856719cf9d 100644 --- a/include/inline-hashtab.h +++ b/include/inline-hashtab.h @@ -51,7 +51,7 @@ htab_create (void) return NULL; ht->size = 3; ht->entries = malloc (sizeof (void *) * ht->size); - ht->free = free; + ht->free = __rtld_free; if (! ht->entries) { free (ht); @@ -167,7 +167,7 @@ htab_expand (struct hashtab *htab, int (*hash_fn) (void *)) /* Use the free() corresponding to the malloc() above to free this up. */ - htab->free = free; + htab->free = __rtld_free; return 1; } diff --git a/include/libc-symbols.h b/include/libc-symbols.h index 685e20fdc0..33e2d34c53 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -421,7 +421,14 @@ for linking") # define _default_symbol_version(real, name, version) \ __asm__ (".symver " #real "," #name "@@" #version) # endif -#else + +/* Evalutes to a string literal for VERSION in LIB. */ +# define symbol_version_string(lib, version) \ + _symbol_version_stringify_1 (VERSION_##lib##_##version) +# define _symbol_version_stringify_1(arg) _symbol_version_stringify_2 (arg) +# define _symbol_version_stringify_2(arg) #arg + +#else /* !SHARED */ # define symbol_version(real, name, version) # define default_symbol_version(real, name, version) \ strong_alias(real, name) diff --git a/include/malloc.h b/include/malloc.h index 70d32c7c84..0765482c51 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -1,7 +1,9 @@ #ifndef _MALLOC_H + #include <malloc/malloc.h> # ifndef _ISOMAC +# include <rtld-malloc.h> /* In the GNU libc we rename the global variable `__malloc_initialized' to `__libc_malloc_initialized'. */ diff --git a/include/rtld-malloc.h b/include/rtld-malloc.h new file mode 100644 index 0000000000..b026a3270c --- /dev/null +++ b/include/rtld-malloc.h @@ -0,0 +1,85 @@ +/* Redirection of malloc inside the dynamic linker. + Copyright (C) 2020 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +/* The dynamic linker needs to use its own minimal malloc before libc + has been relocated, and the libc malloc afterwards. The active + malloc implementation is reached via the __rtld_* function pointers + declared below. They are initialized to the minimal malloc by + __rtld_malloc_init_stubs, and set to the final implementation by + __rtld_malloc_init_real. */ + +#ifndef _RTLD_MALLOC_H +#define _RTLD_MALLOC_H + +#if IS_IN (rtld) + +extern __typeof (calloc) *__rtld_calloc attribute_hidden; +extern __typeof (free) *__rtld_free attribute_hidden; +extern __typeof (malloc) *__rtld_malloc attribute_hidden; +extern __typeof (realloc) *__rtld_realloc attribute_hidden; + +/* Wrapper functions which call through the function pointers above. + Note that it is not supported to take the address of those + functions. Instead the function pointers must be used + directly. */ + +__extern_inline void * +calloc (size_t a, size_t b) +{ + return __rtld_calloc (a, b); +} + +__extern_inline void +free (void *ptr) +{ + __rtld_free (ptr); +} + +__extern_inline void * +malloc (size_t size) +{ + return __rtld_malloc (size); +} + +__extern_inline void * +realloc (void *ptr, size_t size) +{ + return __rtld_realloc (ptr, size); +} + +/* Called after the first self-relocation to activate the minimal malloc + implementation. */ +void __rtld_malloc_init_stubs (void) attribute_hidden; + +/* Called shortly before the final self-relocation (when RELRO + variables are still writable) to activate the real malloc + implementation. MAIN_MAP is the link map of the executable. */ +struct link_map; +void __rtld_malloc_init_real (struct link_map *main_map) attribute_hidden; + +#else /* !IS_IN (rtld) */ + +/* This allows static/non-rtld builds to get a pointer to the + functions, in the same way that is required inside rtld. */ +# define __rtld_calloc (&calloc) +# define __rtld_free (&free) +# define __rtld_malloc (&malloc) +# define __rtld_realloc (&realloc) + +#endif /* !IS_IN (rtld) */ +#endif /* _RTLD_MALLOC_H */ diff --git a/include/stdlib.h b/include/stdlib.h index 1fab78aa16..926f965f69 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -9,6 +9,8 @@ #if !defined _ISOMAC # include <sys/stat.h> +# include <rtld-malloc.h> + extern __typeof (strtol_l) __strtol_l; extern __typeof (strtoul_l) __strtoul_l; extern __typeof (strtoll_l) __strtoll_l; diff --git a/sysdeps/generic/localplt.data b/sysdeps/generic/localplt.data index 2d5c66ae28..e2083c0ce6 100644 --- a/sysdeps/generic/localplt.data +++ b/sysdeps/generic/localplt.data @@ -7,12 +7,6 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/mach/hurd/i386/ld.abilist b/sysdeps/mach/hurd/i386/ld.abilist index c76b913486..6f591b2496 100644 --- a/sysdeps/mach/hurd/i386/ld.abilist +++ b/sysdeps/mach/hurd/i386/ld.abilist @@ -16,10 +16,6 @@ GLIBC_2.2.6 _dl_mcount F GLIBC_2.2.6 _hurd_intr_rpc_mach_msg F GLIBC_2.2.6 _r_debug D 0x14 GLIBC_2.2.6 abort F -GLIBC_2.2.6 calloc F -GLIBC_2.2.6 free F -GLIBC_2.2.6 malloc F -GLIBC_2.2.6 realloc F GLIBC_2.3 ___tls_get_addr F GLIBC_2.3 __tls_get_addr F GLIBC_2.4 __stack_chk_guard D 0x4 diff --git a/sysdeps/mach/hurd/i386/localplt.data b/sysdeps/mach/hurd/i386/localplt.data index c1725d140f..102323e64f 100644 --- a/sysdeps/mach/hurd/i386/localplt.data +++ b/sysdeps/mach/hurd/i386/localplt.data @@ -9,12 +9,6 @@ libc.so: malloc + REL R_386_GLOB_DAT libc.so: memalign + REL R_386_GLOB_DAT libc.so: realloc + REL R_386_GLOB_DAT libm.so: matherr + REL R_386_GLOB_DAT -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc + REL R_386_GLOB_DAT -ld.so: calloc + REL R_386_GLOB_DAT -ld.so: realloc + REL R_386_GLOB_DAT -ld.so: free + REL R_386_GLOB_DAT # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error + REL R_386_GLOB_DAT ld.so: _dl_catch_error + REL R_386_GLOB_DAT diff --git a/sysdeps/unix/sysv/linux/aarch64/ld.abilist b/sysdeps/unix/sysv/linux/aarch64/ld.abilist index 4ffe688649..80b2fe6725 100644 --- a/sysdeps/unix/sysv/linux/aarch64/ld.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/ld.abilist @@ -3,7 +3,3 @@ GLIBC_2.17 __stack_chk_guard D 0x8 GLIBC_2.17 __tls_get_addr F GLIBC_2.17 _dl_mcount F GLIBC_2.17 _r_debug D 0x28 -GLIBC_2.17 calloc F -GLIBC_2.17 free F -GLIBC_2.17 malloc F -GLIBC_2.17 realloc F diff --git a/sysdeps/unix/sysv/linux/aarch64/localplt.data b/sysdeps/unix/sysv/linux/aarch64/localplt.data index a60053b914..56f362d3a7 100644 --- a/sysdeps/unix/sysv/linux/aarch64/localplt.data +++ b/sysdeps/unix/sysv/linux/aarch64/localplt.data @@ -9,12 +9,6 @@ libc.so: realloc libm.so: matherr # The dynamic loader needs __tls_get_addr for TLS. ld.so: __tls_get_addr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/alpha/ld.abilist b/sysdeps/unix/sysv/linux/alpha/ld.abilist index 98b66edabf..98a03f611f 100644 --- a/sysdeps/unix/sysv/linux/alpha/ld.abilist +++ b/sysdeps/unix/sysv/linux/alpha/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.0 _r_debug D 0x28 -GLIBC_2.0 calloc F -GLIBC_2.0 free F -GLIBC_2.0 malloc F -GLIBC_2.0 realloc F GLIBC_2.1 __libc_stack_end D 0x8 GLIBC_2.1 _dl_mcount F GLIBC_2.3 __tls_get_addr F diff --git a/sysdeps/unix/sysv/linux/alpha/localplt.data b/sysdeps/unix/sysv/linux/alpha/localplt.data index c69eb04ce5..43f6fdaea1 100644 --- a/sysdeps/unix/sysv/linux/alpha/localplt.data +++ b/sysdeps/unix/sysv/linux/alpha/localplt.data @@ -26,12 +26,6 @@ libm.so: matherr + RELA R_ALPHA_GLOB_DAT libm.so: __atan2 # The dynamic loader needs __tls_get_addr for TLS. ld.so: __tls_get_addr ? -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc + RELA R_ALPHA_GLOB_DAT -ld.so: calloc + RELA R_ALPHA_GLOB_DAT -ld.so: realloc + RELA R_ALPHA_GLOB_DAT -ld.so: free + RELA R_ALPHA_GLOB_DAT # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error + RELA R_ALPHA_GLOB_DAT ld.so: _dl_catch_error + RELA R_ALPHA_GLOB_DAT diff --git a/sysdeps/unix/sysv/linux/arm/be/ld.abilist b/sysdeps/unix/sysv/linux/arm/be/ld.abilist index a301c6ebc4..cc8825c3bc 100644 --- a/sysdeps/unix/sysv/linux/arm/be/ld.abilist +++ b/sysdeps/unix/sysv/linux/arm/be/ld.abilist @@ -3,7 +3,3 @@ GLIBC_2.4 __stack_chk_guard D 0x4 GLIBC_2.4 __tls_get_addr F GLIBC_2.4 _dl_mcount F GLIBC_2.4 _r_debug D 0x14 -GLIBC_2.4 calloc F -GLIBC_2.4 free F -GLIBC_2.4 malloc F -GLIBC_2.4 realloc F diff --git a/sysdeps/unix/sysv/linux/arm/le/ld.abilist b/sysdeps/unix/sysv/linux/arm/le/ld.abilist index a301c6ebc4..cc8825c3bc 100644 --- a/sysdeps/unix/sysv/linux/arm/le/ld.abilist +++ b/sysdeps/unix/sysv/linux/arm/le/ld.abilist @@ -3,7 +3,3 @@ GLIBC_2.4 __stack_chk_guard D 0x4 GLIBC_2.4 __tls_get_addr F GLIBC_2.4 _dl_mcount F GLIBC_2.4 _r_debug D 0x14 -GLIBC_2.4 calloc F -GLIBC_2.4 free F -GLIBC_2.4 malloc F -GLIBC_2.4 realloc F diff --git a/sysdeps/unix/sysv/linux/arm/localplt.data b/sysdeps/unix/sysv/linux/arm/localplt.data index 7bd541c28a..0c3af0c64e 100644 --- a/sysdeps/unix/sysv/linux/arm/localplt.data +++ b/sysdeps/unix/sysv/linux/arm/localplt.data @@ -8,12 +8,6 @@ libm.so: matherr libpthread.so: raise # The dynamic loader needs __tls_get_addr for TLS. ld.so: __tls_get_addr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/csky/ld.abilist b/sysdeps/unix/sysv/linux/csky/ld.abilist index 71576160ed..564ac09737 100644 --- a/sysdeps/unix/sysv/linux/csky/ld.abilist +++ b/sysdeps/unix/sysv/linux/csky/ld.abilist @@ -3,7 +3,3 @@ GLIBC_2.29 __stack_chk_guard D 0x4 GLIBC_2.29 __tls_get_addr F GLIBC_2.29 _dl_mcount F GLIBC_2.29 _r_debug D 0x14 -GLIBC_2.29 calloc F -GLIBC_2.29 free F -GLIBC_2.29 malloc F -GLIBC_2.29 realloc F diff --git a/sysdeps/unix/sysv/linux/csky/localplt.data b/sysdeps/unix/sysv/linux/csky/localplt.data index 14c02cb2d6..0ed8650b65 100644 --- a/sysdeps/unix/sysv/linux/csky/localplt.data +++ b/sysdeps/unix/sysv/linux/csky/localplt.data @@ -6,12 +6,6 @@ libc.so: free libc.so: malloc libc.so: memalign libc.so: realloc -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/hppa/ld.abilist b/sysdeps/unix/sysv/linux/hppa/ld.abilist index 0387614d8f..d155a59843 100644 --- a/sysdeps/unix/sysv/linux/hppa/ld.abilist +++ b/sysdeps/unix/sysv/linux/hppa/ld.abilist @@ -1,9 +1,5 @@ GLIBC_2.2 __libc_stack_end D 0x4 GLIBC_2.2 _dl_mcount F GLIBC_2.2 _r_debug D 0x14 -GLIBC_2.2 calloc F -GLIBC_2.2 free F -GLIBC_2.2 malloc F -GLIBC_2.2 realloc F GLIBC_2.3 __tls_get_addr F GLIBC_2.4 __stack_chk_guard D 0x4 diff --git a/sysdeps/unix/sysv/linux/hppa/localplt.data b/sysdeps/unix/sysv/linux/hppa/localplt.data index 867413f0c5..09893d4dcf 100644 --- a/sysdeps/unix/sysv/linux/hppa/localplt.data +++ b/sysdeps/unix/sysv/linux/hppa/localplt.data @@ -10,12 +10,6 @@ libc.so: __sigsetjmp libc.so: _IO_funlockfile libc.so: __errno_location libm.so: matherr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/i386/ld.abilist b/sysdeps/unix/sysv/linux/i386/ld.abilist index edb7307228..0478e22071 100644 --- a/sysdeps/unix/sysv/linux/i386/ld.abilist +++ b/sysdeps/unix/sysv/linux/i386/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.0 _r_debug D 0x14 -GLIBC_2.0 calloc F -GLIBC_2.0 free F -GLIBC_2.0 malloc F -GLIBC_2.0 realloc F GLIBC_2.1 __libc_stack_end D 0x4 GLIBC_2.1 _dl_mcount F GLIBC_2.3 ___tls_get_addr F diff --git a/sysdeps/unix/sysv/linux/i386/localplt.data b/sysdeps/unix/sysv/linux/i386/localplt.data index f6f20a5d15..5334875b4b 100644 --- a/sysdeps/unix/sysv/linux/i386/localplt.data +++ b/sysdeps/unix/sysv/linux/i386/localplt.data @@ -7,12 +7,6 @@ libc.so: malloc + REL R_386_GLOB_DAT libc.so: memalign + REL R_386_GLOB_DAT libc.so: realloc + REL R_386_GLOB_DAT libm.so: matherr + REL R_386_GLOB_DAT -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc + REL R_386_GLOB_DAT -ld.so: calloc + REL R_386_GLOB_DAT -ld.so: realloc + REL R_386_GLOB_DAT -ld.so: free + REL R_386_GLOB_DAT # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error + REL R_386_GLOB_DAT ld.so: _dl_catch_error + REL R_386_GLOB_DAT diff --git a/sysdeps/unix/sysv/linux/ia64/ld.abilist b/sysdeps/unix/sysv/linux/ia64/ld.abilist index 82042472c3..33f91199bf 100644 --- a/sysdeps/unix/sysv/linux/ia64/ld.abilist +++ b/sysdeps/unix/sysv/linux/ia64/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.2 __libc_stack_end D 0x8 GLIBC_2.2 _dl_mcount F GLIBC_2.2 _r_debug D 0x28 -GLIBC_2.2 calloc F -GLIBC_2.2 free F -GLIBC_2.2 malloc F -GLIBC_2.2 realloc F GLIBC_2.3 __tls_get_addr F diff --git a/sysdeps/unix/sysv/linux/ia64/localplt.data b/sysdeps/unix/sysv/linux/ia64/localplt.data index 3820e2a4e6..1c566a503e 100644 --- a/sysdeps/unix/sysv/linux/ia64/localplt.data +++ b/sysdeps/unix/sysv/linux/ia64/localplt.data @@ -6,12 +6,6 @@ libc.so: realloc libm.so: matherr libm.so: matherrf libm.so: matherrl -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/ld.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/ld.abilist index a301c6ebc4..cc8825c3bc 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/ld.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/ld.abilist @@ -3,7 +3,3 @@ GLIBC_2.4 __stack_chk_guard D 0x4 GLIBC_2.4 __tls_get_addr F GLIBC_2.4 _dl_mcount F GLIBC_2.4 _r_debug D 0x14 -GLIBC_2.4 calloc F -GLIBC_2.4 free F -GLIBC_2.4 malloc F -GLIBC_2.4 realloc F diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data index 4a07bf387e..3c5efb7204 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data @@ -5,12 +5,6 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/ld.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/ld.abilist index c9ec45cf1c..3ba474c27f 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/ld.abilist +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.0 _r_debug D 0x14 -GLIBC_2.0 calloc F -GLIBC_2.0 free F -GLIBC_2.0 malloc F -GLIBC_2.0 realloc F GLIBC_2.1 __libc_stack_end D 0x4 GLIBC_2.1 _dl_mcount F GLIBC_2.3 __tls_get_addr F diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data index c70d6ea301..843f4e25f2 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data @@ -6,12 +6,6 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/microblaze/ld.abilist b/sysdeps/unix/sysv/linux/microblaze/ld.abilist index aa0d71150a..a4933c3541 100644 --- a/sysdeps/unix/sysv/linux/microblaze/ld.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/ld.abilist @@ -3,7 +3,3 @@ GLIBC_2.18 __stack_chk_guard D 0x4 GLIBC_2.18 __tls_get_addr F GLIBC_2.18 _dl_mcount F GLIBC_2.18 _r_debug D 0x14 -GLIBC_2.18 calloc F -GLIBC_2.18 free F -GLIBC_2.18 malloc F -GLIBC_2.18 realloc F diff --git a/sysdeps/unix/sysv/linux/microblaze/localplt.data b/sysdeps/unix/sysv/linux/microblaze/localplt.data index 8ca23897df..0e98d5251e 100644 --- a/sysdeps/unix/sysv/linux/microblaze/localplt.data +++ b/sysdeps/unix/sysv/linux/microblaze/localplt.data @@ -7,12 +7,6 @@ libc.so: realloc libm.so: matherr # The dynamic loader needs __tls_get_addr for TLS. ld.so: __tls_get_addr ? -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/mips/mips32/ld.abilist b/sysdeps/unix/sysv/linux/mips/mips32/ld.abilist index 55d48868e8..be09641a48 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/ld.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.0 _r_debug D 0x14 -GLIBC_2.0 calloc F -GLIBC_2.0 free F -GLIBC_2.0 malloc F -GLIBC_2.0 realloc F GLIBC_2.2 __libc_stack_end D 0x4 GLIBC_2.2 _dl_mcount F GLIBC_2.3 __tls_get_addr F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/ld.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/ld.abilist index 55d48868e8..be09641a48 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/ld.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.0 _r_debug D 0x14 -GLIBC_2.0 calloc F -GLIBC_2.0 free F -GLIBC_2.0 malloc F -GLIBC_2.0 realloc F GLIBC_2.2 __libc_stack_end D 0x4 GLIBC_2.2 _dl_mcount F GLIBC_2.3 __tls_get_addr F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist index 44b345b7cf..1ea36e13f2 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.0 _r_debug D 0x28 -GLIBC_2.0 calloc F -GLIBC_2.0 free F -GLIBC_2.0 malloc F -GLIBC_2.0 realloc F GLIBC_2.2 __libc_stack_end D 0x8 GLIBC_2.2 _dl_mcount F GLIBC_2.3 __tls_get_addr F diff --git a/sysdeps/unix/sysv/linux/nios2/ld.abilist b/sysdeps/unix/sysv/linux/nios2/ld.abilist index 110f1039fa..52178802dd 100644 --- a/sysdeps/unix/sysv/linux/nios2/ld.abilist +++ b/sysdeps/unix/sysv/linux/nios2/ld.abilist @@ -3,7 +3,3 @@ GLIBC_2.21 __stack_chk_guard D 0x4 GLIBC_2.21 __tls_get_addr F GLIBC_2.21 _dl_mcount F GLIBC_2.21 _r_debug D 0x14 -GLIBC_2.21 calloc F -GLIBC_2.21 free F -GLIBC_2.21 malloc F -GLIBC_2.21 realloc F diff --git a/sysdeps/unix/sysv/linux/nios2/localplt.data b/sysdeps/unix/sysv/linux/nios2/localplt.data index 3805ed56b9..b37987c7c0 100644 --- a/sysdeps/unix/sysv/linux/nios2/localplt.data +++ b/sysdeps/unix/sysv/linux/nios2/localplt.data @@ -28,12 +28,6 @@ libc.so: __eqdf2 libc.so: __extendsfdf2 libc.so: __floatundidf ? libm.so: matherr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data index e822e0a480..a02dd5cc24 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data @@ -5,12 +5,6 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist index e8b0ea3a9b..4bbfba7a61 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.0 _r_debug D 0x14 -GLIBC_2.0 calloc F -GLIBC_2.0 free F -GLIBC_2.0 malloc F -GLIBC_2.0 realloc F GLIBC_2.1 __libc_stack_end D 0x4 GLIBC_2.1 _dl_mcount F GLIBC_2.22 __tls_get_addr_opt F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data index 647e735fdf..d8072597b7 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data @@ -36,12 +36,6 @@ libc.so: realloc libm.so: copysignl ? libm.so: fabsl libm.so: matherr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist index edfc9ca56f..283fb4510b 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/ld.abilist @@ -4,7 +4,3 @@ GLIBC_2.3 __libc_stack_end D 0x8 GLIBC_2.3 __tls_get_addr F GLIBC_2.3 _dl_mcount F GLIBC_2.3 _r_debug D 0x28 -GLIBC_2.3 calloc F -GLIBC_2.3 free F -GLIBC_2.3 malloc F -GLIBC_2.3 realloc F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist index 37c8f6684b..b1f313c7cd 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ld.abilist @@ -2,9 +2,5 @@ GLIBC_2.17 __libc_stack_end D 0x8 GLIBC_2.17 __tls_get_addr F GLIBC_2.17 _dl_mcount F GLIBC_2.17 _r_debug D 0x28 -GLIBC_2.17 calloc F -GLIBC_2.17 free F -GLIBC_2.17 malloc F -GLIBC_2.17 realloc F GLIBC_2.22 __tls_get_addr_opt F GLIBC_2.23 __parse_hwcap_and_convert_at_platform F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data index c1209336d2..bb498fbe3a 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data @@ -4,12 +4,6 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/riscv/localplt.data b/sysdeps/unix/sysv/linux/riscv/localplt.data index 14c02cb2d6..0ed8650b65 100644 --- a/sysdeps/unix/sysv/linux/riscv/localplt.data +++ b/sysdeps/unix/sysv/linux/riscv/localplt.data @@ -6,12 +6,6 @@ libc.so: free libc.so: malloc libc.so: memalign libc.so: realloc -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist index b411871d06..845f356c3c 100644 --- a/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist +++ b/sysdeps/unix/sysv/linux/riscv/rv64/ld.abilist @@ -3,7 +3,3 @@ GLIBC_2.27 __stack_chk_guard D 0x8 GLIBC_2.27 __tls_get_addr F GLIBC_2.27 _dl_mcount F GLIBC_2.27 _r_debug D 0x28 -GLIBC_2.27 calloc F -GLIBC_2.27 free F -GLIBC_2.27 malloc F -GLIBC_2.27 realloc F diff --git a/sysdeps/unix/sysv/linux/s390/localplt.data b/sysdeps/unix/sysv/linux/s390/localplt.data index e822e0a480..a02dd5cc24 100644 --- a/sysdeps/unix/sysv/linux/s390/localplt.data +++ b/sysdeps/unix/sysv/linux/s390/localplt.data @@ -5,12 +5,6 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/ld.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/ld.abilist index 0576c9575e..b56f005beb 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/ld.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.0 _r_debug D 0x14 -GLIBC_2.0 calloc F -GLIBC_2.0 free F -GLIBC_2.0 malloc F -GLIBC_2.0 realloc F GLIBC_2.1 __libc_stack_end D 0x4 GLIBC_2.1 _dl_mcount F GLIBC_2.3 __tls_get_offset F diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist index 1fbb890d1d..6f788a086d 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.2 __libc_stack_end D 0x8 GLIBC_2.2 _dl_mcount F GLIBC_2.2 _r_debug D 0x28 -GLIBC_2.2 calloc F -GLIBC_2.2 free F -GLIBC_2.2 malloc F -GLIBC_2.2 realloc F GLIBC_2.3 __tls_get_offset F diff --git a/sysdeps/unix/sysv/linux/sh/be/ld.abilist b/sysdeps/unix/sysv/linux/sh/be/ld.abilist index 0387614d8f..d155a59843 100644 --- a/sysdeps/unix/sysv/linux/sh/be/ld.abilist +++ b/sysdeps/unix/sysv/linux/sh/be/ld.abilist @@ -1,9 +1,5 @@ GLIBC_2.2 __libc_stack_end D 0x4 GLIBC_2.2 _dl_mcount F GLIBC_2.2 _r_debug D 0x14 -GLIBC_2.2 calloc F -GLIBC_2.2 free F -GLIBC_2.2 malloc F -GLIBC_2.2 realloc F GLIBC_2.3 __tls_get_addr F GLIBC_2.4 __stack_chk_guard D 0x4 diff --git a/sysdeps/unix/sysv/linux/sh/le/ld.abilist b/sysdeps/unix/sysv/linux/sh/le/ld.abilist index 0387614d8f..d155a59843 100644 --- a/sysdeps/unix/sysv/linux/sh/le/ld.abilist +++ b/sysdeps/unix/sysv/linux/sh/le/ld.abilist @@ -1,9 +1,5 @@ GLIBC_2.2 __libc_stack_end D 0x4 GLIBC_2.2 _dl_mcount F GLIBC_2.2 _r_debug D 0x14 -GLIBC_2.2 calloc F -GLIBC_2.2 free F -GLIBC_2.2 malloc F -GLIBC_2.2 realloc F GLIBC_2.3 __tls_get_addr F GLIBC_2.4 __stack_chk_guard D 0x4 diff --git a/sysdeps/unix/sysv/linux/sh/localplt.data b/sysdeps/unix/sysv/linux/sh/localplt.data index babb19d717..3225177c50 100644 --- a/sysdeps/unix/sysv/linux/sh/localplt.data +++ b/sysdeps/unix/sysv/linux/sh/localplt.data @@ -12,12 +12,6 @@ libc.so: __errno_location libm.so: matherr # Generated by the compiler because there is no trap insn pattern. libc.so: abort ? -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/ld.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/ld.abilist index fd0b33f86d..0c6610e3c2 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/ld.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.0 _r_debug D 0x14 -GLIBC_2.0 calloc F -GLIBC_2.0 free F -GLIBC_2.0 malloc F -GLIBC_2.0 realloc F GLIBC_2.1 __libc_stack_end D 0x4 GLIBC_2.1 _dl_mcount F GLIBC_2.3 __tls_get_addr F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data index 6bf10ff858..be51efd566 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data @@ -19,12 +19,6 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist index 82042472c3..33f91199bf 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.2 __libc_stack_end D 0x8 GLIBC_2.2 _dl_mcount F GLIBC_2.2 _r_debug D 0x28 -GLIBC_2.2 calloc F -GLIBC_2.2 free F -GLIBC_2.2 malloc F -GLIBC_2.2 realloc F GLIBC_2.3 __tls_get_addr F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data index b881b9096d..809062d46c 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data @@ -18,12 +18,6 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc -ld.so: calloc -ld.so: realloc -ld.so: free # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error ld.so: _dl_catch_error diff --git a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist index 0dc9430611..d3cdf7611e 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist @@ -1,8 +1,4 @@ GLIBC_2.2.5 __libc_stack_end D 0x8 GLIBC_2.2.5 _dl_mcount F GLIBC_2.2.5 _r_debug D 0x28 -GLIBC_2.2.5 calloc F -GLIBC_2.2.5 free F -GLIBC_2.2.5 malloc F -GLIBC_2.2.5 realloc F GLIBC_2.3 __tls_get_addr F diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist index 80f3161586..c70bccf782 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist @@ -2,7 +2,3 @@ GLIBC_2.16 __libc_stack_end D 0x4 GLIBC_2.16 __tls_get_addr F GLIBC_2.16 _dl_mcount F GLIBC_2.16 _r_debug D 0x14 -GLIBC_2.16 calloc F -GLIBC_2.16 free F -GLIBC_2.16 malloc F -GLIBC_2.16 realloc F diff --git a/sysdeps/x86_64/localplt.data b/sysdeps/x86_64/localplt.data index c27a02b66a..8f41e92870 100644 --- a/sysdeps/x86_64/localplt.data +++ b/sysdeps/x86_64/localplt.data @@ -9,12 +9,6 @@ libc.so: malloc + RELA R_X86_64_GLOB_DAT libc.so: memalign + RELA R_X86_64_GLOB_DAT libc.so: realloc + RELA R_X86_64_GLOB_DAT libm.so: matherr + RELA R_X86_64_GLOB_DAT -# The main malloc is interposed into the dynamic linker, for -# allocations after the initial link (when dlopen is used). -ld.so: malloc + RELA R_X86_64_GLOB_DAT -ld.so: calloc + RELA R_X86_64_GLOB_DAT -ld.so: realloc + RELA R_X86_64_GLOB_DAT -ld.so: free + RELA R_X86_64_GLOB_DAT # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error + RELA R_X86_64_GLOB_DAT ld.so: _dl_catch_error + RELA R_X86_64_GLOB_DAT