2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 06:25:31 +00: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:
Ondřej Surý
2023-12-21 11:12:54 +01:00
parent 2ff908026d
commit 41a0ee1071
4 changed files with 33 additions and 7 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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.
*/

View File

@@ -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);
}