From patchwork Wed Jun 30 15:19:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddhesh Poyarekar X-Patchwork-Id: 44060 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id EC6EF394CC08 for ; Wed, 30 Jun 2021 15:25:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EC6EF394CC08 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1625066741; bh=nXBfDen+wdFukTad1caSLBUfF8ckuT7JWrbgRFZTftk=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=Q9av7ATQ/Ebob7IIQ+szqn1L3pt5Ga6I3jvCSAwI8AQNnWftYRf7Qji2bN0u4S28X Pow5JIAzeRuL9mbNoiXR5MhzlDjekLesCdHewTCutWlVXSqhiMnLKnIcj9ENTdlVQl qb/3LgatosFbfrFkkxDAHxrXM9yLu3vpasAuvMaI= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from cross.elm.relay.mailchannels.net (cross.elm.relay.mailchannels.net [23.83.212.46]) by sourceware.org (Postfix) with ESMTPS id 1C4653853829 for ; Wed, 30 Jun 2021 15:20:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1C4653853829 X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 3E3331E1DEE; Wed, 30 Jun 2021 15:20:05 +0000 (UTC) Received: from pdx1-sub0-mail-a91.g.dreamhost.com (100-96-13-105.trex-nlb.outbound.svc.cluster.local [100.96.13.105]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 8BDFA1E1DBF; Wed, 30 Jun 2021 15:20:04 +0000 (UTC) X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org Received: from pdx1-sub0-mail-a91.g.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384) by 100.96.13.105 (trex/6.3.3); Wed, 30 Jun 2021 15:20:05 +0000 X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|siddhesh@gotplt.org X-MailChannels-Auth-Id: dreamhost X-Hysterical-Abiding: 1bdbaec111026efa_1625066405014_1734696581 X-MC-Loop-Signature: 1625066405014:3970749670 X-MC-Ingress-Time: 1625066405014 Received: from pdx1-sub0-mail-a91.g.dreamhost.com (localhost [127.0.0.1]) by pdx1-sub0-mail-a91.g.dreamhost.com (Postfix) with ESMTP id 2AF147E6B2; Wed, 30 Jun 2021 08:20:04 -0700 (PDT) Received: from rhbox.intra.reserved-bit.com (unknown [1.186.101.110]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: siddhesh@gotplt.org) by pdx1-sub0-mail-a91.g.dreamhost.com (Postfix) with ESMTPSA id 747A37E6CF; Wed, 30 Jun 2021 08:19:59 -0700 (PDT) X-DH-BACKEND: pdx1-sub0-mail-a91 To: libc-alpha@sourceware.org Subject: [PATCH v2 07/10] mtrace: Wean away from malloc hooks Date: Wed, 30 Jun 2021 20:49:18 +0530 Message-Id: <20210630151921.2752628-8-siddhesh@sourceware.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210630151921.2752628-1-siddhesh@sourceware.org> References: <20210630151921.2752628-1-siddhesh@sourceware.org> MIME-Version: 1.0 X-Spam-Status: No, score=-3493.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_NONE, KAM_DMARC_STATUS, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NEUTRAL, TXREP, URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Siddhesh Poyarekar via Libc-alpha From: Siddhesh Poyarekar Reply-To: Siddhesh Poyarekar Cc: fweimer@redhat.com Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Split mtrace hooks into before and after and adapt to the new internal debugging hooks infrastructure. With this, the malloc hooks are unused internally and can be removed from the main library. This also eliminates the only use of memalign through a PLT in the library, so checklocalplt data needs to be updated to reflect that. --- include/malloc.h | 1 + malloc/Makefile | 2 +- malloc/hooks.c | 40 ++- malloc/mtrace-hooks.c | 137 ++++++++++ malloc/mtrace.c | 233 +----------------- sysdeps/generic/localplt.data | 1 - sysdeps/mach/hurd/i386/localplt.data | 1 - sysdeps/unix/sysv/linux/aarch64/localplt.data | 1 - sysdeps/unix/sysv/linux/alpha/localplt.data | 1 - sysdeps/unix/sysv/linux/arc/localplt.data | 1 - sysdeps/unix/sysv/linux/arm/localplt.data | 1 - sysdeps/unix/sysv/linux/csky/localplt.data | 1 - sysdeps/unix/sysv/linux/hppa/localplt.data | 1 - sysdeps/unix/sysv/linux/i386/localplt.data | 1 - sysdeps/unix/sysv/linux/ia64/localplt.data | 1 - .../sysv/linux/m68k/coldfire/localplt.data | 1 - .../unix/sysv/linux/m68k/m680x0/localplt.data | 1 - .../unix/sysv/linux/microblaze/localplt.data | 1 - sysdeps/unix/sysv/linux/nios2/localplt.data | 1 - .../linux/powerpc/powerpc32/fpu/localplt.data | 1 - .../powerpc/powerpc32/nofpu/localplt.data | 1 - .../linux/powerpc/powerpc64/localplt.data | 1 - sysdeps/unix/sysv/linux/riscv/localplt.data | 1 - sysdeps/unix/sysv/linux/s390/localplt.data | 1 - sysdeps/unix/sysv/linux/sh/localplt.data | 1 - .../sysv/linux/sparc/sparc32/localplt.data | 1 - .../sysv/linux/sparc/sparc64/localplt.data | 1 - sysdeps/x86_64/localplt.data | 1 - 28 files changed, 183 insertions(+), 253 deletions(-) create mode 100644 malloc/mtrace-hooks.c diff --git a/include/malloc.h b/include/malloc.h index bb1123d9d3..6169d486f5 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -15,6 +15,7 @@ typedef struct malloc_state *mstate; #define __malloc_initialized __libc_malloc_initialized /* Nonzero if the malloc is already initialized. */ extern int __malloc_initialized attribute_hidden; +extern FILE *__mtrace_mallstream attribute_hidden; enum mcheck_status __mcheck_checkptr (const void *) attribute_hidden; extern int __mcheck_initialize (void (*) (enum mcheck_status), bool) diff --git a/malloc/Makefile b/malloc/Makefile index 7afeebbe2a..62cc1bf2f5 100644 --- a/malloc/Makefile +++ b/malloc/Makefile @@ -270,7 +270,7 @@ $(objpfx)memusage: memusage.sh # Extra dependencies $(foreach o,$(all-object-suffixes),$(objpfx)malloc$(o)): arena.c hooks.c -hooks.c: malloc-check.c mcheck-hooks.c +hooks.c: malloc-check.c mcheck-hooks.c mtrace-hooks.c # Compile the tests with a flag which suppresses the mallopt call in # the test skeleton. diff --git a/malloc/hooks.c b/malloc/hooks.c index 7b500e5671..7f3b07ca44 100644 --- a/malloc/hooks.c +++ b/malloc/hooks.c @@ -37,6 +37,7 @@ enum malloc_debug_hooks MALLOC_NONE_HOOK = 0, MALLOC_CHECK_HOOK = 1 << 0, /* MALLOC_CHECK_ or glibc.malloc.check. */ MALLOC_MCHECK_HOOK = 1 << 1, /* mcheck() */ + MALLOC_MTRACE_HOOK = 1 << 2, /* mtrace() */ }; static unsigned __malloc_debugging_hooks; @@ -79,6 +80,7 @@ __malloc_debug_disable (enum malloc_debug_hooks flag) #include "malloc-check.c" #include "mcheck-hooks.c" +#include "mtrace-hooks.c" static __always_inline bool _malloc_debug_before (size_t *bytesp, void **victimp, const void *address) @@ -111,8 +113,13 @@ _malloc_debug_before (size_t *bytesp, void **victimp, const void *address) static __always_inline void * _malloc_debug_after (void *mem, size_t bytes, const void *address) { - if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL) - mem = malloc_mcheck_after (mem, bytes); + if (__glibc_unlikely (__malloc_debugging_hooks)) + { + if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL) + mem = malloc_mcheck_after (mem, bytes); + if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK)) + mem = malloc_mtrace_after (mem, bytes, address); + } return mem; } @@ -129,6 +136,8 @@ _free_debug_before (void **mem, const void *address) if (__glibc_unlikely (__malloc_debugging_hooks)) { + if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK)) + free_mtrace (mem, address); if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK)) *mem = free_mcheck (*mem); if (__is_malloc_debug_enabled (MALLOC_CHECK_HOOK)) @@ -171,8 +180,13 @@ static __always_inline void * _realloc_debug_after (void *mem, void *oldmem, size_t bytes, size_t oldsize, const void *address) { - if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL) - mem = realloc_mcheck_after (mem, oldmem, bytes, oldsize); + if (__glibc_unlikely (__malloc_debugging_hooks)) + { + if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL) + mem = realloc_mcheck_after (mem, oldmem, bytes, oldsize); + if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK)) + mem = realloc_mtrace_after (mem, oldmem, bytes, address); + } return mem; } @@ -206,8 +220,13 @@ static __always_inline void * _memalign_debug_after (void *mem, size_t alignment, size_t bytes, const void *address) { - if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL) - mem = memalign_mcheck_after (mem, alignment, bytes); + if (__glibc_unlikely (__malloc_debugging_hooks)) + { + if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK) && mem != NULL) + mem = memalign_mcheck_after (mem, alignment, bytes); + if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK)) + mem = memalign_mtrace_after (mem, bytes, address); + } return mem; } @@ -244,11 +263,16 @@ _calloc_debug_before (size_t *bytesp, void **victimp, const void *address) static __always_inline void * _calloc_debug_after (void *mem, size_t bytes, const void *address) { - if (__glibc_unlikely (__malloc_debugging_hooks) && mem != NULL) + if (__glibc_unlikely (__malloc_debugging_hooks)) { if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK)) mem = malloc_mcheck_after (mem, bytes); - memset (mem, 0, bytes); + if (__is_malloc_debug_enabled (MALLOC_MTRACE_HOOK)) + mem = malloc_mtrace_after (mem, bytes, address); + /* mtrace uses __libc_calloc to do the zeroing. */ + if (mem != NULL && __is_malloc_debug_enabled (MALLOC_CHECK_HOOK + | MALLOC_MCHECK_HOOK)) + memset (mem, 0, bytes); } return mem; } diff --git a/malloc/mtrace-hooks.c b/malloc/mtrace-hooks.c new file mode 100644 index 0000000000..c1c6d6a6e9 --- /dev/null +++ b/malloc/mtrace-hooks.c @@ -0,0 +1,137 @@ + +# include + +#include + +FILE *__mtrace_mallstream; + +__libc_lock_define_initialized (static, lock); + +static void +tr_where (const void *caller, Dl_info *info) +{ + if (caller != NULL) + { + if (info != NULL) + { + char *buf = (char *) ""; + if (info->dli_sname != NULL) + { + size_t len = strlen (info->dli_sname); + buf = alloca (len + 6 + 2 * sizeof (void *)); + + buf[0] = '('; + __stpcpy (_fitoa (caller >= (const void *) info->dli_saddr + ? caller - (const void *) info->dli_saddr + : (const void *) info->dli_saddr - caller, + __stpcpy (__mempcpy (buf + 1, info->dli_sname, + len), + caller >= (void *) info->dli_saddr + ? "+0x" : "-0x"), + 16, 0), + ")"); + } + + fprintf (__mtrace_mallstream, "@ %s%s%s[%p] ", + info->dli_fname ? : "", info->dli_fname ? ":" : "", + buf, caller); + } + else + fprintf (__mtrace_mallstream, "@ [%p] ", caller); + } +} + +static Dl_info * +lock_and_info (const void *caller, Dl_info *mem) +{ + if (caller == NULL) + return NULL; + + Dl_info *res = _dl_addr (caller, mem, NULL, NULL) ? mem : NULL; + + __libc_lock_lock (lock); + + return res; +} + +static bool +free_mtrace (void *ptr, const void *caller) +{ + if (ptr == NULL) + return true; + + Dl_info mem; + Dl_info *info = lock_and_info (caller, &mem); + tr_where (caller, info); + /* Be sure to print it first. */ + fprintf (__mtrace_mallstream, "- %p\n", ptr); + __libc_lock_unlock (lock); + + /* Continue on to free. */ + return false; +} + +static void * +malloc_mtrace_after (void *block, size_t size, const void *caller) +{ + Dl_info mem; + Dl_info *info = lock_and_info (caller, &mem); + + tr_where (caller, info); + /* We could be printing a NULL here; that's OK. */ + fprintf (__mtrace_mallstream, "+ %p %#lx\n", block, + (unsigned long int) size); + + __libc_lock_unlock (lock); + + return block; +} + +static void * +realloc_mtrace_after (void *block, const void *oldptr, size_t size, + const void *caller) +{ + Dl_info mem; + Dl_info *info = lock_and_info (caller, &mem); + + tr_where (caller, info); + if (block == NULL) + { + if (size != 0) + /* Failed realloc. */ + fprintf (__mtrace_mallstream, "! %p %#lx\n", oldptr, + (unsigned long int) size); + else + fprintf (__mtrace_mallstream, "- %p\n", oldptr); + } + else if (oldptr == NULL) + fprintf (__mtrace_mallstream, "+ %p %#lx\n", block, + (unsigned long int) size); + else + { + fprintf (__mtrace_mallstream, "< %p\n", oldptr); + tr_where (caller, info); + fprintf (__mtrace_mallstream, "> %p %#lx\n", block, + (unsigned long int) size); + } + + __libc_lock_unlock (lock); + + return block; +} + +static void * +memalign_mtrace_after (void *block, size_t size, const void *caller) +{ + Dl_info mem; + Dl_info *info = lock_and_info (caller, &mem); + + tr_where (caller, info); + /* We could be printing a NULL here; that's OK. */ + fprintf (__mtrace_mallstream, "+ %p %#lx\n", block, + (unsigned long int) size); + + __libc_lock_unlock (lock); + + return block; +} diff --git a/malloc/mtrace.c b/malloc/mtrace.c index 6c2c58b706..2cc4507e25 100644 --- a/malloc/mtrace.c +++ b/malloc/mtrace.c @@ -22,7 +22,6 @@ # define _MALLOC_INTERNAL # include # include -# include #endif #include @@ -35,20 +34,14 @@ #include #include - #include #define setvbuf(s, b, f, l) _IO_setvbuf (s, b, f, l) #define fwrite(buf, size, count, fp) _IO_fwrite (buf, size, count, fp) -#include - #define TRACE_BUFFER_SIZE 512 -static FILE *mallstream; -static const char mallenv[] = "MALLOC_TRACE"; static char *malloc_trace_buffer; - -__libc_lock_define_initialized (static, lock); +static const char mallenv[] = "MALLOC_TRACE"; #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_34) /* Compatibility symbols that were introduced to help break at allocation sites @@ -69,204 +62,6 @@ tr_break (void) compat_symbol (libc, tr_break, tr_break, GLIBC_2_0); #endif - -/* Old hook values. */ -static void (*tr_old_free_hook) (void *ptr, const void *); -static void *(*tr_old_malloc_hook) (size_t size, const void *); -static void *(*tr_old_realloc_hook) (void *ptr, size_t size, - const void *); -static void *(*tr_old_memalign_hook) (size_t __alignment, size_t __size, - const void *); - -static void -tr_where (const void *caller, Dl_info *info) -{ - if (caller != NULL) - { - if (info != NULL) - { - char *buf = (char *) ""; - if (info->dli_sname != NULL) - { - size_t len = strlen (info->dli_sname); - buf = alloca (len + 6 + 2 * sizeof (void *)); - - buf[0] = '('; - __stpcpy (_fitoa (caller >= (const void *) info->dli_saddr - ? caller - (const void *) info->dli_saddr - : (const void *) info->dli_saddr - caller, - __stpcpy (__mempcpy (buf + 1, info->dli_sname, - len), - caller >= (void *) info->dli_saddr - ? "+0x" : "-0x"), - 16, 0), - ")"); - } - - fprintf (mallstream, "@ %s%s%s[%p] ", - info->dli_fname ? : "", info->dli_fname ? ":" : "", - buf, caller); - } - else - fprintf (mallstream, "@ [%p] ", caller); - } -} - -static Dl_info * -lock_and_info (const void *caller, Dl_info *mem) -{ - if (caller == NULL) - return NULL; - - Dl_info *res = _dl_addr (caller, mem, NULL, NULL) ? mem : NULL; - - __libc_lock_lock (lock); - - return res; -} - -static void tr_freehook (void *, const void *); -static void * tr_mallochook (size_t, const void *); -static void * tr_reallochook (void *, size_t, const void *); -static void * tr_memalignhook (size_t, size_t, const void *); - -/* Set all the default non-trace hooks. */ -static __always_inline void -set_default_hooks (void) -{ - __free_hook = tr_old_free_hook; - __malloc_hook = tr_old_malloc_hook; - __realloc_hook = tr_old_realloc_hook; - __memalign_hook = tr_old_memalign_hook; -} - -/* Set all of the tracing hooks used for mtrace. */ -static __always_inline void -set_trace_hooks (void) -{ - __free_hook = tr_freehook; - __malloc_hook = tr_mallochook; - __realloc_hook = tr_reallochook; - __memalign_hook = tr_memalignhook; -} - -/* Save the current set of hooks as the default hooks. */ -static __always_inline void -save_default_hooks (void) -{ - tr_old_free_hook = __free_hook; - tr_old_malloc_hook = __malloc_hook; - tr_old_realloc_hook = __realloc_hook; - tr_old_memalign_hook = __memalign_hook; -} - -static void -tr_freehook (void *ptr, const void *caller) -{ - if (ptr == NULL) - return; - - Dl_info mem; - Dl_info *info = lock_and_info (caller, &mem); - tr_where (caller, info); - /* Be sure to print it first. */ - fprintf (mallstream, "- %p\n", ptr); - set_default_hooks (); - if (tr_old_free_hook != NULL) - (*tr_old_free_hook)(ptr, caller); - else - free (ptr); - set_trace_hooks (); - __libc_lock_unlock (lock); -} - -static void * -tr_mallochook (size_t size, const void *caller) -{ - void *hdr; - - Dl_info mem; - Dl_info *info = lock_and_info (caller, &mem); - - set_default_hooks (); - if (tr_old_malloc_hook != NULL) - hdr = (void *) (*tr_old_malloc_hook)(size, caller); - else - hdr = (void *) malloc (size); - set_trace_hooks (); - - tr_where (caller, info); - /* We could be printing a NULL here; that's OK. */ - fprintf (mallstream, "+ %p %#lx\n", hdr, (unsigned long int) size); - - __libc_lock_unlock (lock); - - return hdr; -} - -static void * -tr_reallochook (void *ptr, size_t size, const void *caller) -{ - void *hdr; - - Dl_info mem; - Dl_info *info = lock_and_info (caller, &mem); - - set_default_hooks (); - if (tr_old_realloc_hook != NULL) - hdr = (void *) (*tr_old_realloc_hook)(ptr, size, caller); - else - hdr = (void *) realloc (ptr, size); - set_trace_hooks (); - - tr_where (caller, info); - if (hdr == NULL) - { - if (size != 0) - /* Failed realloc. */ - fprintf (mallstream, "! %p %#lx\n", ptr, (unsigned long int) size); - else - fprintf (mallstream, "- %p\n", ptr); - } - else if (ptr == NULL) - fprintf (mallstream, "+ %p %#lx\n", hdr, (unsigned long int) size); - else - { - fprintf (mallstream, "< %p\n", ptr); - tr_where (caller, info); - fprintf (mallstream, "> %p %#lx\n", hdr, (unsigned long int) size); - } - - __libc_lock_unlock (lock); - - return hdr; -} - -static void * -tr_memalignhook (size_t alignment, size_t size, const void *caller) -{ - void *hdr; - - Dl_info mem; - Dl_info *info = lock_and_info (caller, &mem); - - set_default_hooks (); - if (tr_old_memalign_hook != NULL) - hdr = (void *) (*tr_old_memalign_hook)(alignment, size, caller); - else - hdr = (void *) memalign (alignment, size); - set_trace_hooks (); - - tr_where (caller, info); - /* We could be printing a NULL here; that's OK. */ - fprintf (mallstream, "+ %p %#lx\n", hdr, (unsigned long int) size); - - __libc_lock_unlock (lock); - - return hdr; -} - - #ifdef _LIBC /* This function gets called to make sure all memory the library @@ -276,7 +71,7 @@ static void __libc_freeres_fn_section release_libc_mem (void) { /* Only call the free function if we still are running in mtrace mode. */ - if (mallstream != NULL) + if (__mtrace_mallstream != NULL) __libc_freeres (); } #endif @@ -293,7 +88,7 @@ mtrace (void) char *mallfile; /* Don't panic if we're called more than once. */ - if (mallstream != NULL) + if (__mtrace_mallstream != NULL) return; #ifdef _LIBC @@ -310,15 +105,15 @@ mtrace (void) if (mtb == NULL) return; - mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "wce"); - if (mallstream != NULL) + __mtrace_mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", + "wce"); + if (__mtrace_mallstream != NULL) { /* Be sure it doesn't malloc its buffer! */ malloc_trace_buffer = mtb; - setvbuf (mallstream, malloc_trace_buffer, _IOFBF, TRACE_BUFFER_SIZE); - fprintf (mallstream, "= Start\n"); - save_default_hooks (); - set_trace_hooks (); + setvbuf (__mtrace_mallstream, malloc_trace_buffer, _IOFBF, + TRACE_BUFFER_SIZE); + fprintf (__mtrace_mallstream, "= Start\n"); #ifdef _LIBC if (!added_atexit_handler) { @@ -336,15 +131,11 @@ mtrace (void) void muntrace (void) { - if (mallstream == NULL) + if (__mtrace_mallstream == NULL) return; - /* Do the reverse of what done in mtrace: first reset the hooks and - MALLSTREAM, and only after that write the trailer and close the - file. */ - FILE *f = mallstream; - mallstream = NULL; - set_default_hooks (); + FILE *f = __mtrace_mallstream; + __mtrace_mallstream = NULL; fprintf (f, "= End\n"); fclose (f); diff --git a/sysdeps/generic/localplt.data b/sysdeps/generic/localplt.data index e2083c0ce6..9b4f35786a 100644 --- a/sysdeps/generic/localplt.data +++ b/sysdeps/generic/localplt.data @@ -4,7 +4,6 @@ libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libm.so: matherr # The TLS-enabled version of these functions is interposed from libc.so. diff --git a/sysdeps/mach/hurd/i386/localplt.data b/sysdeps/mach/hurd/i386/localplt.data index 94064ecbc5..47fbe1e2a7 100644 --- a/sysdeps/mach/hurd/i386/localplt.data +++ b/sysdeps/mach/hurd/i386/localplt.data @@ -6,7 +6,6 @@ libc.so: calloc + REL R_386_GLOB_DAT libc.so: free + REL R_386_GLOB_DAT 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 TLS-enabled version of these functions is interposed from libc.so. diff --git a/sysdeps/unix/sysv/linux/aarch64/localplt.data b/sysdeps/unix/sysv/linux/aarch64/localplt.data index 2c14b652ef..348b3f3793 100644 --- a/sysdeps/unix/sysv/linux/aarch64/localplt.data +++ b/sysdeps/unix/sysv/linux/aarch64/localplt.data @@ -4,7 +4,6 @@ libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libm.so: matherr # If outline atomics are used, libgcc (built outside of glibc) may diff --git a/sysdeps/unix/sysv/linux/alpha/localplt.data b/sysdeps/unix/sysv/linux/alpha/localplt.data index 43f6fdaea1..44bf36f4f1 100644 --- a/sysdeps/unix/sysv/linux/alpha/localplt.data +++ b/sysdeps/unix/sysv/linux/alpha/localplt.data @@ -18,7 +18,6 @@ libc.so: _Unwind_Find_FDE libc.so: calloc + RELA R_ALPHA_GLOB_DAT libc.so: free + RELA R_ALPHA_GLOB_DAT libc.so: malloc + RELA R_ALPHA_GLOB_DAT -libc.so: memalign + RELA R_ALPHA_GLOB_DAT libc.so: realloc + RELA R_ALPHA_GLOB_DAT libm.so: matherr + RELA R_ALPHA_GLOB_DAT # We used to offer inline functions that used this, so it must be exported. diff --git a/sysdeps/unix/sysv/linux/arc/localplt.data b/sysdeps/unix/sysv/linux/arc/localplt.data index 4479e8ee8a..ac5332caf7 100644 --- a/sysdeps/unix/sysv/linux/arc/localplt.data +++ b/sysdeps/unix/sysv/linux/arc/localplt.data @@ -1,6 +1,5 @@ libc.so: realloc libc.so: malloc -libc.so: memalign libc.so: calloc libc.so: free # At -Os, a struct assignment in libgcc-static pulls this in diff --git a/sysdeps/unix/sysv/linux/arm/localplt.data b/sysdeps/unix/sysv/linux/arm/localplt.data index eb315da2f1..78896444c6 100644 --- a/sysdeps/unix/sysv/linux/arm/localplt.data +++ b/sysdeps/unix/sysv/linux/arm/localplt.data @@ -1,7 +1,6 @@ libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: raise libc.so: realloc libm.so: matherr diff --git a/sysdeps/unix/sysv/linux/csky/localplt.data b/sysdeps/unix/sysv/linux/csky/localplt.data index 0ed8650b65..817ab2659a 100644 --- a/sysdeps/unix/sysv/linux/csky/localplt.data +++ b/sysdeps/unix/sysv/linux/csky/localplt.data @@ -4,7 +4,6 @@ libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc # The TLS-enabled version of these functions is interposed from libc.so. ld.so: _dl_signal_error diff --git a/sysdeps/unix/sysv/linux/hppa/localplt.data b/sysdeps/unix/sysv/linux/hppa/localplt.data index 09893d4dcf..baf857a750 100644 --- a/sysdeps/unix/sysv/linux/hppa/localplt.data +++ b/sysdeps/unix/sysv/linux/hppa/localplt.data @@ -4,7 +4,6 @@ libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libc.so: __sigsetjmp libc.so: _IO_funlockfile diff --git a/sysdeps/unix/sysv/linux/i386/localplt.data b/sysdeps/unix/sysv/linux/i386/localplt.data index 5334875b4b..f9bf7fb410 100644 --- a/sysdeps/unix/sysv/linux/i386/localplt.data +++ b/sysdeps/unix/sysv/linux/i386/localplt.data @@ -4,7 +4,6 @@ libc.so: _Unwind_Find_FDE + REL R_386_GLOB_DAT libc.so: calloc + REL R_386_GLOB_DAT libc.so: free + REL R_386_GLOB_DAT 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 TLS-enabled version of these functions is interposed from libc.so. diff --git a/sysdeps/unix/sysv/linux/ia64/localplt.data b/sysdeps/unix/sysv/linux/ia64/localplt.data index 1c566a503e..174fb88128 100644 --- a/sysdeps/unix/sysv/linux/ia64/localplt.data +++ b/sysdeps/unix/sysv/linux/ia64/localplt.data @@ -1,7 +1,6 @@ libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libm.so: matherr libm.so: matherrf diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data index 3c5efb7204..42fa90508c 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data @@ -2,7 +2,6 @@ libc.so: __m68k_read_tp libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libm.so: matherr # The TLS-enabled version of these functions is interposed from libc.so. diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data index 843f4e25f2..34bd4c1aca 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data @@ -3,7 +3,6 @@ libc.so: __m68k_read_tp libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libm.so: matherr # The TLS-enabled version of these functions is interposed from libc.so. diff --git a/sysdeps/unix/sysv/linux/microblaze/localplt.data b/sysdeps/unix/sysv/linux/microblaze/localplt.data index 0e98d5251e..c3801314c9 100644 --- a/sysdeps/unix/sysv/linux/microblaze/localplt.data +++ b/sysdeps/unix/sysv/linux/microblaze/localplt.data @@ -2,7 +2,6 @@ libc.so: __errno_location libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libm.so: matherr # The dynamic loader needs __tls_get_addr for TLS. diff --git a/sysdeps/unix/sysv/linux/nios2/localplt.data b/sysdeps/unix/sysv/linux/nios2/localplt.data index b37987c7c0..17fcfdd4db 100644 --- a/sysdeps/unix/sysv/linux/nios2/localplt.data +++ b/sysdeps/unix/sysv/linux/nios2/localplt.data @@ -6,7 +6,6 @@ libc.so: __gedf2 libc.so: malloc libc.so: __gtsf2 ? libc.so: __nesf2 -libc.so: memalign libc.so: __mulsf3 libc.so: __floatunsisf libc.so: __addsf3 diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data index a02dd5cc24..c0af84eef7 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data @@ -2,7 +2,6 @@ libc.so: _Unwind_Find_FDE libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libm.so: matherr # The TLS-enabled version of these functions is interposed from libc.so. diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data index d8072597b7..581e54b95c 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data @@ -30,7 +30,6 @@ libc.so: abort ? libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: memset ? libc.so: realloc libm.so: copysignl ? diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data index bb498fbe3a..d69b7ae646 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data @@ -1,7 +1,6 @@ libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libm.so: matherr # The TLS-enabled version of these functions is interposed from libc.so. diff --git a/sysdeps/unix/sysv/linux/riscv/localplt.data b/sysdeps/unix/sysv/linux/riscv/localplt.data index 0a235592c3..e6d5330d5b 100644 --- a/sysdeps/unix/sysv/linux/riscv/localplt.data +++ b/sysdeps/unix/sysv/linux/riscv/localplt.data @@ -4,7 +4,6 @@ libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: memset ? libc.so: realloc # The TLS-enabled version of these functions is interposed from libc.so. diff --git a/sysdeps/unix/sysv/linux/s390/localplt.data b/sysdeps/unix/sysv/linux/s390/localplt.data index a02dd5cc24..c0af84eef7 100644 --- a/sysdeps/unix/sysv/linux/s390/localplt.data +++ b/sysdeps/unix/sysv/linux/s390/localplt.data @@ -2,7 +2,6 @@ libc.so: _Unwind_Find_FDE libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libm.so: matherr # The TLS-enabled version of these functions is interposed from libc.so. diff --git a/sysdeps/unix/sysv/linux/sh/localplt.data b/sysdeps/unix/sysv/linux/sh/localplt.data index 3225177c50..6491b9e37b 100644 --- a/sysdeps/unix/sysv/linux/sh/localplt.data +++ b/sysdeps/unix/sysv/linux/sh/localplt.data @@ -4,7 +4,6 @@ libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libc.so: _Unwind_Find_FDE libc.so: _exit diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data index be51efd566..38309a1393 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data @@ -16,7 +16,6 @@ libc.so: _Unwind_Find_FDE libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libm.so: matherr # The TLS-enabled version of these functions is interposed from libc.so. diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data index 809062d46c..6a216f3a5a 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data @@ -15,7 +15,6 @@ libc.so: _Unwind_Find_FDE libc.so: calloc libc.so: free libc.so: malloc -libc.so: memalign libc.so: realloc libm.so: matherr # The TLS-enabled version of these functions is interposed from libc.so. diff --git a/sysdeps/x86_64/localplt.data b/sysdeps/x86_64/localplt.data index 8f41e92870..d1f2e26612 100644 --- a/sysdeps/x86_64/localplt.data +++ b/sysdeps/x86_64/localplt.data @@ -6,7 +6,6 @@ libc.so: calloc + RELA R_X86_64_GLOB_DAT libc.so: free + RELA R_X86_64_GLOB_DAT 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 TLS-enabled version of these functions is interposed from libc.so.