Paste: alpine arm64 enable bootstrap dots
Author: | erg |
Mode: | factor |
Date: | Wed, 27 Aug 2025 00:12:55 |
Plain Text |
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<callstack>(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%
New Annotation