#!/bin/bash set -e INPUT_EXE="build_win/demo64k.exe" STRIPPED_EXE="build_win/demo64k_stripped.exe" PACKED_EXE="build_win/demo64k_packed.exe" if [ ! -f "$INPUT_EXE" ]; then echo "Error: $INPUT_EXE not found. Run scripts/build_win.sh first." exit 1 fi echo "Crunching $INPUT_EXE..." # 1. Strip debug symbols and sections cp "$INPUT_EXE" "$STRIPPED_EXE" x86_64-w64-mingw32-strip -s "$STRIPPED_EXE" x86_64-w64-mingw32-strip --strip-unneeded "$STRIPPED_EXE" x86_64-w64-mingw32-strip -R .comment -R .gnu.version "$STRIPPED_EXE" # 2. Pack with UPX # --best: max compression # --lzma: use lzma algorithm (usually smallest) # --filter=...: filters for x86 code cp "$STRIPPED_EXE" "$PACKED_EXE" upx --best --lzma --overlay=strip "$PACKED_EXE" echo "------------------------------------------------" echo "Size Report:" ls -lh "$INPUT_EXE" ls -lh "$STRIPPED_EXE" ls -lh "$PACKED_EXE" echo "------------------------------------------------" echo "Top 20 Largest Symbols (from unstripped):" x86_64-w64-mingw32-nm --print-size --size-sort --radix=d "$INPUT_EXE" | grep -v debug_ | tail -n 20 echo "------------------------------------------------"