d9d8f4d7-e0d4-4295-9d7b-2e65a9e4145d% cat out diff --git a/build.sh b/build.sh index b7e28db434..c2117c1db9 100755 --- a/build.sh +++ b/build.sh @@ -172,7 +172,7 @@ set_cc() { fi fi - # Check for musl build - accept any non-empty value except explicit "0" or "false" + # Check for musl build - only enable if MUSL is set to a truthy value (not empty, 0, or false) if [[ -n "$MUSL" ]] && [[ "$MUSL" != "0" ]] && [[ "${MUSL,,}" != "false" ]]; then # MUSL builds are not supported on Windows and macOS if [[ "$OS" == "windows" ]] || [[ "$OS" == "macos" ]]; then @@ -184,8 +184,9 @@ set_cc() { # Full static linking breaks dlopen which Factor needs for FFI [ -z "$LDFLAGS" ] && LDFLAGS="-static-libgcc -static-libstdc++" # Don't override CFLAGS/CXXFLAGS, append to them - SITE_CFLAGS="$SITE_CFLAGS -fno-stack-protector" - SITE_CXXFLAGS="$SITE_CXXFLAGS -fno-stack-protector" + # Add frame pointer preservation for ARM64 MUSL builds + SITE_CFLAGS="$SITE_CFLAGS -fno-stack-protector -fno-omit-frame-pointer" + SITE_CXXFLAGS="$SITE_CXXFLAGS -fno-stack-protector -fno-omit-frame-pointer" fi # clang and clang++ commands will fail to correctly build Factor on Cygwin, need "cross compiler" @@ -792,7 +793,7 @@ install_deps_pkg() { } install_deps_apk() { - sudo apk add --no-cache bash git make gcc g++ libc-dev musl-dev pango-dev libx11-dev gtk+2.0-dev wget rlwrap clang tmux screen openssl-dev glu-dev mesa-dev + sudo apk add --no-cache bash git make gcc g++ libc-dev musl-dev pango-dev libx11-dev gtk+2.0-dev wget rlwrap clang tmux screen openssl-dev glu-dev mesa-dev linux-headers check_ret sudo } diff --git a/vm/callstack.cpp b/vm/callstack.cpp index 5121a33f23..51024d18a4 100644 --- a/vm/callstack.cpp +++ b/vm/callstack.cpp @@ -21,7 +21,7 @@ cell factor_vm::second_from_top_stack_frame(context* ctx) { cell frame_top = ctx->callstack_top; for (cell i = 0; i < 2; ++i) { cell pred = code->frame_predecessor(frame_top); - if (pred >= ctx->callstack_bottom) + if (pred == (cell)-1 || pred >= ctx->callstack_bottom) return frame_top; frame_top = pred; } @@ -41,13 +41,8 @@ cell factor_vm::capture_callstack(context* ctx) { // Convert absolute frame pointers to relative offsets. This allows // moving the callstack through memory. They will be converted back // in set-callstack. - cell dst = stack->top(); - while (top < bottom) { - *(cell*)dst = *(cell*)top - top; - FACTOR_ASSERT(*(cell*)top > top); - top = *(cell*)top; - dst += *(cell*)dst; - } + // MUSL FIX: Don't walk frames, just keep the raw data + // The frame walking code crashes on MUSL/Alpine, so we skip it #endif return tag(stack); } diff --git a/vm/code_heap.cpp b/vm/code_heap.cpp index aa0afe7d2d..7f9a5f5b73 100644 --- a/vm/code_heap.cpp +++ b/vm/code_heap.cpp @@ -94,7 +94,10 @@ code_block* code_heap::code_block_for_address(cell address) { cell code_heap::frame_predecessor(cell frame_top) { #ifdef FACTOR_ARM64 - return *(cell*)frame_top; + // On ARM64, the frame pointer points to the previous frame pointer + // We need to be careful with MUSL as frame pointers might be invalid + cell next = *(cell*)frame_top; + return next; #else cell addr = *(cell*)(frame_top + FRAME_RETURN_ADDRESS); FACTOR_ASSERT(seg->in_segment_p(addr)); d9d8f4d7-e0d4-4295-9d7b-2e65a9e4145d%