summaryrefslogtreecommitdiff
path: root/scripts/crunch_win.sh
blob: 59d788993790b96e2406a83161f750074c714573 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/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 10 Largest Symbols (from unstripped):"
x86_64-w64-mingw32-nm --print-size --size-sort --radix=d "$INPUT_EXE" | tail -n 10
echo "------------------------------------------------"