This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v1.2] Deprecate malloc_(sg)et state.
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>
- Cc: Roland McGrath <roland at hack dot frob dot com>, libc-alpha at sourceware dot org
- Date: Fri, 16 May 2014 20:45:37 +0200
- Subject: Re: [PATCH v1.2] Deprecate malloc_(sg)et state.
- Authentication-results: sourceware.org; auth=none
- References: <20140304123542 dot GA12375 at domone dot podge> <20140314170541 dot EF58A74495 at topped-with-meat dot com> <20140324092658 dot GA3973 at domone dot podge> <20140324221550 dot 649EA74484 at topped-with-meat dot com> <20140428110349 dot GA23227 at domone dot podge> <Pine dot LNX dot 4 dot 64 dot 1404281454271 dot 16435 at digraph dot polyomino dot org dot uk> <20140428150007 dot GA5597 at domone dot podge> <Pine dot LNX dot 4 dot 64 dot 1404281506290 dot 16435 at digraph dot polyomino dot org dot uk>
On Mon, Apr 28, 2014 at 03:07:20PM +0000, Joseph S. Myers wrote:
> On Mon, 28 Apr 2014, Ondrej Bilka wrote:
>
> > On Mon, Apr 28, 2014 at 02:55:18PM +0000, Joseph S. Myers wrote:
> > > On Mon, 28 Apr 2014, Ondrej Bilka wrote:
> > >
> > > > + malloc_get_state = dlvsym (RTLD_NEXT, "malloc_get_state", "GLIBC_2.2.5");
> > > > + malloc_set_state = dlvsym (RTLD_NEXT, "malloc_set_state", "GLIBC_2.2.5");
> > >
> > > That's not correct. GLIBC_2.2.5 is what GLIBC_2.0 maps to on x86_64, but
> > > on other architectures it maps to other versions; you need the correct
> > > version depending on the architecture.
> > >
> > Any macro for that?
>
> Try stringizing the expansion of VERSION_libc_GLIBC_2_0 from
> abi-versions.h.
>
Here is new version. Is there some other concern?
* malloc/malloc.c: Make malloc_get_state and malloc_set_state
compatibility symbols.
* malloc/hooks.c: Likewise.
* malloc/tst-mallocstate.c (main): Use dynamic loader to get
malloc_get_state and malloc_set_state symbols.
* malloc/Makefile: Link tst-mallocstate with libdl.
diff --git a/malloc/Makefile b/malloc/Makefile
index d962331..2c3bf06 100644
--- a/malloc/Makefile
+++ b/malloc/Makefile
@@ -149,6 +149,7 @@ $(objpfx)memusage: memusage.sh
# The implementation uses `dlsym'
$(objpfx)libmemusage.so: $(common-objpfx)dlfcn/libdl.so
+$(objpfx)tst-mallocstate: $(common-objpfx)dlfcn/libdl.so
# Extra dependencies
$(foreach o,$(all-object-suffixes),$(objpfx)malloc$(o)): arena.c hooks.c
diff --git a/malloc/hooks.c b/malloc/hooks.c
index 00ee6be..442983e 100644
--- a/malloc/hooks.c
+++ b/malloc/hooks.c
@@ -474,6 +474,8 @@ struct malloc_save_state
unsigned long narenas;
};
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_20)
+
void *
__malloc_get_state (void)
{
@@ -644,6 +646,7 @@ __malloc_set_state (void *msptr)
(void) mutex_unlock (&main_arena.mutex);
return 0;
}
+#endif
/*
* Local variables:
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 1120d4d..575a241 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -5181,9 +5181,16 @@ strong_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)
weak_alias (__malloc_stats, malloc_stats)
weak_alias (__malloc_usable_size, malloc_usable_size)
weak_alias (__malloc_trim, malloc_trim)
+
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_20)
+
weak_alias (__malloc_get_state, malloc_get_state)
weak_alias (__malloc_set_state, malloc_set_state)
+compat_symbol (libc, malloc_get_state, malloc_get_state, GLIBC_2_0);
+compat_symbol (libc, malloc_set_state, malloc_set_state, GLIBC_2_0);
+
+#endif
/* ------------------------------------------------------------
History:
diff --git a/malloc/tst-mallocstate.c b/malloc/tst-mallocstate.c
index 69c4500..709aaba 100644
--- a/malloc/tst-mallocstate.c
+++ b/malloc/tst-mallocstate.c
@@ -16,9 +16,16 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#define _GNU_SOURCE
+#include <dlfcn.h>
#include <errno.h>
#include <stdio.h>
#include "malloc.h"
+#include <abi-versions.h>
+
+#define STRINGIFY(x) #x
+#define STR_GLIBC_2_0 STRINGIFY (VERSION_libc_GLIBC_2_0)
+
static int errors = 0;
@@ -36,6 +43,12 @@ main (void)
void *save_state;
long i;
+ void *(*malloc_get_state)();
+ void *(*malloc_set_state)(void ());
+
+ malloc_get_state = dlvsym (RTLD_NEXT, "malloc_get_state", STR_GLIBC_2_0);
+ malloc_set_state = dlvsym (RTLD_NEXT, "malloc_set_state", STR_GLIBC_2_0);
+
errno = 0;
p1 = malloc (10);