Compare commits

...

1 Commits

Author SHA1 Message Date
Claude Bot
adf2981951 fix(ci): add llvm-symbolizer symlink for Alpine Linux
Alpine's `llvm21` package installs the symbolizer as `llvm21-symbolizer`
(version-prefixed) rather than `llvm-symbolizer`. The `bun-tracestrings`
CI crash report parser uses `Bun.which("llvm-symbolizer")` and fails to
find the binary on Alpine ARM64 (and x64).

- bootstrap.sh: after installing LLVM on Alpine, create an unversioned
  `/usr/bin/llvm-symbolizer` symlink if one doesn't already exist
- crash_handler.zig: add `llvm21-symbolizer` (Alpine naming) to the
  fallback list so crash symbolization works even without the symlink

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-02 10:06:12 +00:00
2 changed files with 15 additions and 3 deletions

View File

@@ -1130,7 +1130,18 @@ install_llvm() {
"clang$(llvm_version)" \
"scudo-malloc" \
"lld$(llvm_version)" \
"llvm$(llvm_version)-dev" # Ensures llvm-symbolizer is installed
"llvm$(llvm_version)-dev"
# Alpine uses versioned binary names (e.g. llvm-symbolizer-21, llvm21-symbolizer).
# Create unversioned symlinks so tools like bun-tracestrings can find them.
if ! command -v llvm-symbolizer > /dev/null 2>&1; then
local llvm_v="$(llvm_version)"
# Try Debian-style naming (llvm-symbolizer-21), then Alpine-style (llvm21-symbolizer)
if command -v "llvm-symbolizer-${llvm_v}" > /dev/null 2>&1; then
execute_sudo ln -sf "$(which "llvm-symbolizer-${llvm_v}")" /usr/bin/llvm-symbolizer
elif command -v "llvm${llvm_v}-symbolizer" > /dev/null 2>&1; then
execute_sudo ln -sf "$(which "llvm${llvm_v}-symbolizer")" /usr/bin/llvm-symbolizer
fi
fi
;;
esac
}

View File

@@ -1700,8 +1700,9 @@ pub fn dumpStackTrace(trace: std.builtin.StackTrace, limits: WriteStackTraceLimi
const programs: []const [:0]const u8 = switch (bun.Environment.os) {
.windows => &.{"pdb-addr2line"},
// if `llvm-symbolizer` doesn't work, also try `llvm-symbolizer-21`
else => &.{ "llvm-symbolizer", "llvm-symbolizer-21" },
// if `llvm-symbolizer` doesn't work, also try versioned names:
// `llvm-symbolizer-21` (Debian/Ubuntu) or `llvm21-symbolizer` (Alpine)
else => &.{ "llvm-symbolizer", "llvm-symbolizer-21", "llvm21-symbolizer" },
};
for (programs) |program| {
var arena = bun.ArenaAllocator.init(bun.default_allocator);