1 #!/bin/bash 2 3 if [ $# -ne 2 ] 4 then 5 echo "usage: bloatcheck old new" 6 exit 1 7 fi 8 9 addline() 10 { 11 NEXT="$(printf "%s% $((50-${#LASTNAME}))d% 10d %10d" "$LASTNAME" "$OLD" "$NEW" "$DELTA")" 12 [ -z "$STUFF" ] && 13 STUFF="$NEXT" || 14 STUFF="$(printf "%s\n%s" "$STUFF" "$NEXT")" 15 } 16 17 do_bloatcheck() 18 { 19 LASTNAME= 20 DELTA=0 21 TOTAL=0 22 OLD=0 23 NEW=0 24 STUFF= 25 26 printf "name% 46s% 10s% 11s\n" old new delta 27 echo "-----------------------------------------------------------------------" 28 while read a b c d 29 do 30 THISNAME=$(echo "$d" | sed 's/[.][0-9]*$//') 31 32 if [ "$LASTNAME" != "$THISNAME" ] 33 then 34 TOTAL=$(($TOTAL+$DELTA)) 35 [ $DELTA -ne 0 ] && addline 36 LASTNAME="$THISNAME" 37 DELTA=0 38 OLD=0 39 NEW=0 40 fi 41 42 SIZE=$(printf "%d" "0x$b") 43 if [ "$a" == "-" ] 44 then 45 OLD=$(($OLD+$SIZE)) 46 SIZE=$((-1*$SIZE)) 47 else 48 NEW=$(($NEW+$SIZE)) 49 fi 50 DELTA=$(($DELTA+$SIZE)) 51 done 52 53 TOTAL=$(($TOTAL+$DELTA)) 54 [ $DELTA -ne 0 ] && addline 55 56 echo "$STUFF" | sort -k4,4nr 57 echo "-----------------------------------------------------------------------" 58 printf "% 71d total\n" "$TOTAL" 59 } 60 61 DIFF1=`mktemp base.XXXXXXX` 62 DIFF2=`mktemp bloat.XXXXXXX` 63 trap "rm $DIFF1 $DIFF2" EXIT 64 nm --size-sort "$1" | sort -k3,3 > $DIFF1 65 nm --size-sort "$2" | sort -k3,3 > $DIFF2 66 diff -U 0 $DIFF1 $DIFF2 | tail -n +3 | sed -n 's/^\([-+]\)/\1 /p' \ 67 | sort -k4,4 | do_bloatcheck 68