Skip to content

Commit a600ca8

Browse files
committed
Update Backtrace Android binaries for 16KB support
Replace `libbacktrace-native.so` and `libnative-lib.so` with new builds aligned for 16KB page size. Remove `libcrashpad_handler.so` from all ABI folders Add 16kb verification script
1 parent 4d18e22 commit a600ca8

File tree

10 files changed

+96
-0
lines changed

10 files changed

+96
-0
lines changed
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

scripts/verify-elf-16k.sh

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#!/usr/bin/env bash
2+
# Bash 3.2 compatible (macOS). Enforces 16KB alignment only for arm64-v8a and x86_64.
3+
set -euo pipefail
4+
5+
ROOT="${1:-packages/react-native/android/src/main/jniLibs}"
6+
# ABIs to enforce (space-separated). Edit or override via: ABIS="arm64-v8a x86_64" bash ...
7+
ABIS=${ABIS:-"arm64-v8a x86_64"}
8+
9+
# --- Locate an ELF reader: readelf (Linux), greadelf (Homebrew), or llvm-readobj (Homebrew) ---
10+
READER=""; MODE=""
11+
if command -v readelf >/dev/null 2>&1; then
12+
READER="readelf"; MODE="readelf"
13+
elif command -v greadelf >/dev/null 2>&1; then
14+
READER="greadelf"; MODE="readelf"
15+
elif command -v llvm-readobj >/dev/null 2>&1; then
16+
READER="llvm-readobj"; MODE="llvm"
17+
elif command -v brew >/dev/null 2>&1; then
18+
BINUTILS_PREFIX="$(brew --prefix binutils 2>/dev/null || true)"
19+
LLVM_PREFIX="$(brew --prefix llvm 2>/dev/null || true)"
20+
if [[ -n "$BINUTILS_PREFIX" && -x "$BINUTILS_PREFIX/bin/greadelf" ]]; then
21+
READER="$BINUTILS_PREFIX/bin/greadelf"; MODE="readelf"
22+
elif [[ -n "$LLVM_PREFIX" && -x "$LLVM_PREFIX/bin/llvm-readobj" ]]; then
23+
READER="$LLVM_PREFIX/bin/llvm-readobj"; MODE="llvm"
24+
fi
25+
fi
26+
27+
if [[ -z "$READER" ]]; then
28+
cat <<'EOF' >&2
29+
❌ No ELF reader found.
30+
Fix one:
31+
- brew install binutils # then export PATH="$(brew --prefix binutils)/bin:$PATH"
32+
- brew install llvm # then export PATH="$(brew --prefix llvm)/bin:$PATH"
33+
- (Linux) apt-get install binutils
34+
EOF
35+
exit 2
36+
fi
37+
38+
get_max_align() {
39+
# echo max PT_LOAD alignment (bytes) for a given .so
40+
local so="$1" max=0
41+
if [[ "$MODE" == "readelf" ]]; then
42+
# readelf -lW ... -> ... Align 0x####
43+
# awk '{print $NF}' prints the final token (alignment)
44+
while IFS= read -r align_hex; do
45+
align_hex="${align_hex#0x}"
46+
# bash 3.2 supports base conversion via $((16#...))
47+
local val=$((16#$align_hex))
48+
if (( val > max )); then max=$val; fi
49+
done < <("$READER" -lW "$so" 2>/dev/null | awk '/LOAD/ {print $NF}')
50+
else
51+
# llvm-readobj --program-headers ... -> 'Type: PT_LOAD' ... 'Alignment: 0x####'
52+
local inload=0
53+
# We can’t do multi-state parsing easily in pure shell; use awk.
54+
while IFS= read -r align_hex; do
55+
align_hex="${align_hex#0x}"
56+
local val=$((16#$align_hex))
57+
if (( val > max )); then max=$val; fi
58+
done < <("$READER" --program-headers "$so" 2>/dev/null \
59+
| awk '/Type: PT_LOAD/ {inload=1} inload && /Alignment:/ {print $2; inload=0}')
60+
fi
61+
echo "$max"
62+
}
63+
64+
if [[ ! -d "$ROOT" ]]; then
65+
echo "❌ Directory not found: $ROOT" >&2
66+
exit 1
67+
fi
68+
69+
fail=0
70+
# Iterate ABIs without 'mapfile'
71+
for abi in $ABIS; do
72+
abi_dir="$ROOT/$abi"
73+
if [[ ! -d "$abi_dir" ]]; then
74+
echo "⚠️ ABI directory missing (skipping): $abi_dir"
75+
continue
76+
fi
77+
78+
# List .so files; avoid mapfile, use while+read with -print0/-d ''
79+
has_any=0
80+
while IFS= read -r -d '' so; do
81+
has_any=1
82+
max_align="$(get_max_align "$so" || echo 0)"
83+
if [[ -z "$max_align" || "$max_align" -lt 16384 ]]; then
84+
printf "❌ %s Align %s < 16384 (0x4000)\n" "$so" "${max_align:-N/A}"
85+
fail=1
86+
else
87+
printf "✅ %s Align %d (>= 16384)\n" "$so" "$max_align"
88+
fi
89+
done < <(find "$abi_dir" -type f -name '*.so' -print0 2>/dev/null)
90+
91+
if [[ "$has_any" -eq 0 ]]; then
92+
echo "⚠️ No .so files under: $abi_dir"
93+
fi
94+
done
95+
96+
exit "$fail"

0 commit comments

Comments
 (0)