mirror of
https://github.com/isc-projects/bind9.git
synced 2026-04-15 22:09:31 -04:00
Add workaround for jemalloc linking order
Because we don't use jemalloc functions directly, but only via the libisc library, the dynamic linker might pull the jemalloc library too late when memory has been already allocated via standard libc allocator. Add a workaround round isc_mem_create() that makes the dynamic linker to pull jemalloc earlier than libc.
This commit is contained in:
parent
2ff908026d
commit
41a0ee1071
4 changed files with 33 additions and 7 deletions
12
Makefile.top
12
Makefile.top
|
|
@ -23,12 +23,20 @@ AM_LDFLAGS += \
|
|||
-Wl,-flat_namespace
|
||||
endif HOST_MACOS
|
||||
|
||||
LIBISC_CFLAGS = \
|
||||
if HAVE_JEMALLOC
|
||||
LIBISC_CFLAGS = $(JEMALLOC_CFLAGS)
|
||||
LIBISC_LIBS = $(JEMALLOC_LIBS)
|
||||
else
|
||||
LIBISC_CFLAGS =
|
||||
LIBISC_LIBS =
|
||||
endif
|
||||
|
||||
LIBISC_CFLAGS += \
|
||||
-I$(top_srcdir)/include \
|
||||
-I$(top_srcdir)/lib/isc/include \
|
||||
-I$(top_builddir)/lib/isc/include
|
||||
|
||||
LIBISC_LIBS = $(top_builddir)/lib/isc/libisc.la
|
||||
LIBISC_LIBS += $(top_builddir)/lib/isc/libisc.la
|
||||
if HAVE_DTRACE
|
||||
LIBISC_DTRACE = $(top_builddir)/lib/isc/probes.lo
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include <isc/mutex.h>
|
||||
#include <isc/overflow.h>
|
||||
#include <isc/types.h>
|
||||
#include <isc/urcu.h>
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
|
|
@ -183,7 +184,25 @@ extern unsigned int isc_mem_defaultflags;
|
|||
} while (0)
|
||||
|
||||
/*@{*/
|
||||
/*
|
||||
* This is a little hack to help with dynamic link order,
|
||||
* see https://github.com/jemalloc/jemalloc/issues/2566
|
||||
* for more information.
|
||||
*/
|
||||
#if HAVE_JEMALLOC
|
||||
#include <jemalloc/jemalloc.h>
|
||||
|
||||
extern volatile void *isc__mem_malloc;
|
||||
|
||||
#define isc_mem_create(cp) \
|
||||
{ \
|
||||
isc__mem_create((cp)_ISC_MEM_FILELINE); \
|
||||
isc__mem_malloc = mallocx; \
|
||||
ISC_INSIST(CMM_ACCESS_ONCE(isc__mem_malloc) != NULL); \
|
||||
}
|
||||
#else
|
||||
#define isc_mem_create(cp) isc__mem_create((cp)_ISC_MEM_FILELINE)
|
||||
#endif
|
||||
void
|
||||
isc__mem_create(isc_mem_t **_ISC_MEM_FLARG);
|
||||
|
||||
|
|
|
|||
|
|
@ -69,6 +69,8 @@ unsigned int isc_mem_defaultflags = ISC_MEMFLAG_DEFAULT;
|
|||
|
||||
#define ISC_MEM_ILLEGAL_ARENA (UINT_MAX)
|
||||
|
||||
volatile void *isc__mem_malloc = mallocx;
|
||||
|
||||
/*
|
||||
* Constants.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -24,9 +24,6 @@
|
|||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define UNIT_TESTING
|
||||
#include <cmocka.h>
|
||||
|
||||
#include <isc/buffer.h>
|
||||
#include <isc/file.h>
|
||||
#include <isc/hash.h>
|
||||
|
|
@ -264,7 +261,7 @@ dns_test_tohex(const unsigned char *data, size_t len, char *buf,
|
|||
memset(buf, 0, buflen);
|
||||
isc_buffer_init(&target, buf, buflen);
|
||||
result = isc_hex_totext((isc_region_t *)&source, 1, " ", &target);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
INSIST(result == ISC_R_SUCCESS);
|
||||
|
||||
return (buf);
|
||||
}
|
||||
|
|
@ -428,7 +425,7 @@ dns_test_namefromstring(const char *namestr, dns_fixedname_t *fname) {
|
|||
|
||||
isc_buffer_putmem(b, (const unsigned char *)namestr, length);
|
||||
result = dns_name_fromtext(name, b, NULL, 0, NULL);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
INSIST(result == ISC_R_SUCCESS);
|
||||
|
||||
isc_buffer_free(&b);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue