Using jemalloc with static link
Greg Dhuse
gdhuse at cleversafe.com
Fri Jul 19 08:23:33 PDT 2013
Hi Colin,
On Jul 19, 2013, at 2:41 AM, Colin Hercus <colin at novocraft.com> wrote:
> Hi,
>
> I am trying to test a HPC appl'n with jemalloc to see if it can reduce memory fragmentation and slow memory growth of a long running multi-threaded app.
>
> This application is statically linked as it's not open source and we need one binary distribution to run on multiple Linux versions.
>
> If I configure jemalloc without a jemalloc prefix (je_) and link with -static -ljemalloc I get linker errors for multiply defined symbols
>
> g++ -m64 -Wl,--eh-frame-hdr -o ./bin/xxxx ./obj/xxxx.o ..... -static -pthread -lcrypto -lz -lbz2 -ldl -ljemalloc -lunwind -Wl,-Map=gccmaps/xxxx.map
> /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':
> /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libc.a(malloc.o): In function `__libc_free':
> (.text+0x56b0): multiple definition of `free'
> jemalloc.o:/wd5/downloads/malloc/jemalloc-3.4.0/src/jemalloc.c:1254: first defined here
> /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libc.a(malloc.o): In function `__libc_malloc':
> (.text+0x50d0): multiple definition of `malloc'
> jemalloc.o:/wd5/downloads/malloc/jemalloc-3.4.0/src/jemalloc.c:857: first defined here
> /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libc.a(malloc.o): In function `__libc_realloc':
> (.text+0x57a0): multiple definition of `realloc'
> jemalloc.o:/wd5/downloads/malloc/jemalloc-3.4.0/src/jemalloc.c:1105: first defined here
>
>
> If I build with a prefix of je_ then linking is okay but memory allocation is via glibc malloc. The same is true if I dynamically link without a prefix.
>
> Is there any simple easy way to get je_malloc to hook itself in as a replacement for malloc the way tcmalloc does?
>
One option is to use glibc's mallloc hooks:
http://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html
Here's a small example program that hooks malloc and free, calling jemalloc's implementation built with "--with-jemalloc-prefix=je_":
#include <stdlib.h>
#include <jemalloc/jemalloc.h>
/* Prototypes for __malloc_hook, __free_hook */
#include <malloc.h>
/* Prototypes for our hooks. */
static void my_init_hook (void);
static void *my_malloc_hook (size_t, const void *);
static void my_free_hook (void*, const void *);
/* Override initializing hook from the C library. */
void (*__malloc_initialize_hook) (void) = my_init_hook;
static void
my_init_hook (void)
{
__malloc_hook = my_malloc_hook;
__free_hook = my_free_hook;
}
static void *
my_malloc_hook (size_t size, const void *caller)
{
return je_malloc(size);
}
static void
my_free_hook (void *ptr, const void *caller)
{
je_free(ptr);
}
int main()
{
je_malloc_stats_print(NULL, NULL, NULL);
void *foo = malloc(123);
je_malloc_stats_print(NULL, NULL, NULL);
free(foo);
return 0;
}
Cheers,
Greg
More information about the jemalloc-discuss
mailing list