summaryrefslogtreecommitdiffstats
path: root/dlmalloc/src/malloc.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:12:31 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:12:31 +0000
commit26711fdc8922df06123f2431e7cd9a27cdc2388a (patch)
tree4f9e0d646d4b1bb6821b8b7670b1bd1b280925bd /dlmalloc/src/malloc.c
parentAdding upstream version 0.0~git20230621.7018e24. (diff)
downloadwasi-libc-upstream/0.0_git20230821.ec4566b.tar.xz
wasi-libc-upstream/0.0_git20230821.ec4566b.zip
Adding upstream version 0.0~git20230821.ec4566b.upstream/0.0_git20230821.ec4566b
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dlmalloc/src/malloc.c')
-rw-r--r--dlmalloc/src/malloc.c37
1 files changed, 16 insertions, 21 deletions
diff --git a/dlmalloc/src/malloc.c b/dlmalloc/src/malloc.c
index c9c8ea6..9fdfd8f 100644
--- a/dlmalloc/src/malloc.c
+++ b/dlmalloc/src/malloc.c
@@ -4593,14 +4593,14 @@ void* dlmalloc(size_t bytes) {
ensure_initialization(); /* initialize in sys_alloc if not using locks */
#endif
+ if (!PREACTION(gm)) {
#if __wasilibc_unmodified_upstream // Try to initialize the allocator.
#else
- if (!is_initialized(gm)) {
- try_init_allocator();
- }
+ if (!is_initialized(gm)) {
+ try_init_allocator();
+ }
#endif
- if (!PREACTION(gm)) {
void* mem;
size_t nb;
if (bytes <= MAX_SMALL_REQUEST) {
@@ -5215,7 +5215,7 @@ static void internal_inspect_all(mstate m,
/* Symbol marking the end of data, bss and explicit stack, provided by wasm-ld. */
extern char __heap_base;
-extern char __heap_end __attribute__((__weak__));
+extern char __heap_end;
/* Initialize the initial state of dlmalloc to be able to use free memory between __heap_base and initial. */
static void try_init_allocator(void) {
@@ -5227,23 +5227,18 @@ static void try_init_allocator(void) {
char *base = &__heap_base;
// Try to use the linker pseudo-symbol `__heap_end` for the initial size of
- // the heap, but if that's not defined due to LLVM being too old perhaps then
- // round up `base` to the nearest `PAGESIZE`. The initial size of linear
- // memory will be at least the heap base to this page boundary, and it's then
- // assumed that the initial linear memory image was truncated at that point.
- // While this reflects the default behavior of `wasm-ld` it is also possible
- // for users to craft larger linear memories by passing options to extend
- // beyond this threshold. In this situation the memory will not be used for
- // dlmalloc.
- //
- // Note that `sbrk(0)`, or in dlmalloc-ese `CALL_MORECORE(0)`, is specifically
- // not used here. That captures the current size of the heap but is only
- // correct if the we're the first to try to grow the heap. If the heap has
- // grown elsewhere, such as a different allocator in place, then this would
- // incorrectly claim such memroy as our own.
+ // the heap.
char *end = &__heap_end;
- if (end == NULL)
- end = (char*) page_align((size_t) base);
+ if (end < base) {
+ // "end" can be NULL when 1. you are using an old wasm-ld which doesn't
+ // provide `__heap_end` (< 15.0.7) and 2. something (other libraries
+ // or maybe your app?) includes a weak reference to `__heap_end` and
+ // 3. the weak reference is found by the linker before this strong
+ // reference.
+ //
+ // Note: This is a linker bug: https://github.com/llvm/llvm-project/issues/60829
+ __builtin_trap();
+ }
size_t initial_heap_size = end - base;
/* Check that initial heap is long enough to serve a minimal allocation request. */