Files
OpenRoyale/tools/scripts/analyze_native_libs.sh
T
2026-07-09 07:40:42 +02:00

27 lines
1.6 KiB
Bash

#!/usr/bin/env bash
# analyze_native_libs.sh - regenerate native-side facts for analysis/NATIVE_LIB_*.md.
# Emits ELF headers, NEEDED, JNI exports, import/export counts, and modern-linker checks.
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJ="$(cd "$HERE/../.." && pwd)"
NL="$PROJ/original_reference/native_libs_original"
OUT="$PROJ/analysis/rawdata"; mkdir -p "$OUT"
[ -d "$NL" ] || { echo "Run extract_apk.sh first"; exit 1; }
for so in "$NL"/*.so; do
b="$(basename "$so")"
echo "================= $b ================="
file "$so"
readelf -h "$so" | grep -iE 'Class|Type|Machine|Flags'
echo "-- NEEDED --"; readelf -d "$so" 2>/dev/null | grep -E 'NEEDED|SONAME' | grep -oE '\[.*\]'
echo -n "-- TEXTREL: "; readelf -d "$so" 2>/dev/null | grep -qi TEXTREL && echo PRESENT || echo none
echo -n "-- exec-stack: "; readelf -l "$so" 2>/dev/null | grep -A1 GNU_STACK | grep -qi RWE && echo EXEC || echo non-exec
echo -n "-- JNI exports: "; readelf -W --dyn-syms "$so" 2>/dev/null | grep -cE 'Java_|JNI_OnLoad'
# per-lib dumps
readelf -W --dyn-syms "$so" 2>/dev/null | grep -E 'Java_|JNI_OnLoad' | awk '{print $8}' | sort -u > "$OUT/${b%.so}_jni.txt" || true
readelf -W --dyn-syms "$so" 2>/dev/null | awk '$7!="UND" && ($4=="FUNC"||$4=="OBJECT"){print $8}' | sort -u > "$OUT/${b%.so}_exports.txt" || true
readelf -W --dyn-syms "$so" 2>/dev/null | awk '$7=="UND"{print $8}' | grep -vE '^$' | sort -u > "$OUT/${b%.so}_imports.txt" || true
echo " exports=$(wc -l < "$OUT/${b%.so}_exports.txt") imports=$(wc -l < "$OUT/${b%.so}_imports.txt")"
done
echo "[+] Dumps in $OUT/"