1#!/bin/bash 2 3# objdiff - a small script for validating that a commit or series of commits 4# didn't change object code. 5# 6# Copyright 2014, Jason Cooper <jason@lakedaemon.net> 7# 8# Licensed under the terms of the GNU GPL version 2 9 10# usage example: 11# 12# $ git checkout COMMIT_A 13# $ <your fancy build command here> 14# $ ./scripts/objdiff record path/to/*.o 15# 16# $ git checkout COMMIT_B 17# $ <your fancy build command here> 18# $ ./scripts/objdiff record path/to/*.o 19# 20# $ ./scripts/objdiff diff COMMIT_A COMMIT_B 21# $ 22 23# And to clean up (everything is in .tmp_objdiff/*) 24# $ ./scripts/objdiff clean all 25# 26# Note: 'make mrproper' will also remove .tmp_objdiff 27 28GIT_DIR="`git rev-parse --git-dir`" 29 30if [ -d "$GIT_DIR" ]; then 31 TMPD="${GIT_DIR%git}tmp_objdiff" 32 33 [ -d "$TMPD" ] || mkdir "$TMPD" 34else 35 echo "ERROR: git directory not found." 36 exit 1 37fi 38 39usage() { 40 echo "Usage: $0 <command> <args>" 41 echo " record <list of object files>" 42 echo " diff <commitA> <commitB>" 43 echo " clean all | <commit>" 44 exit 1 45} 46 47dorecord() { 48 [ $# -eq 0 ] && usage 49 50 FILES="$*" 51 52 CMT="`git rev-parse --short HEAD`" 53 54 OBJDUMP="${CROSS_COMPILE}objdump" 55 OBJDIFFD="$TMPD/$CMT" 56 57 [ ! -d "$OBJDIFFD" ] && mkdir -p "$OBJDIFFD" 58 59 for f in $FILES; do 60 dn="${f%/*}" 61 bn="${f##*/}" 62 63 [ ! -d "$OBJDIFFD/$dn" ] && mkdir -p "$OBJDIFFD/$dn" 64 65 # remove addresses for a more clear diff 66 # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and 67 $OBJDUMP -D "$f" | sed "s/^[[:space:]]\+[0-9a-f]\+//" \ 68 >"$OBJDIFFD/$dn/$bn" 69 done 70} 71 72dodiff() { 73 [ $# -ne 2 ] && [ $# -ne 0 ] && usage 74 75 if [ $# -eq 0 ]; then 76 SRC="`git rev-parse --short HEAD^`" 77 DST="`git rev-parse --short HEAD`" 78 else 79 SRC="`git rev-parse --short $1`" 80 DST="`git rev-parse --short $2`" 81 fi 82 83 DIFF="`which colordiff`" 84 85 if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then 86 DIFF="`which diff`" 87 fi 88 89 SRCD="$TMPD/$SRC" 90 DSTD="$TMPD/$DST" 91 92 if [ ! -d "$SRCD" ]; then 93 echo "ERROR: $SRCD doesn't exist" 94 exit 1 95 fi 96 97 if [ ! -d "$DSTD" ]; then 98 echo "ERROR: $DSTD doesn't exist" 99 exit 1 100 fi 101 102 $DIFF -Nurd $SRCD $DSTD 103} 104 105doclean() { 106 [ $# -eq 0 ] && usage 107 [ $# -gt 1 ] && usage 108 109 if [ "x$1" = "xall" ]; then 110 rm -rf $TMPD/* 111 else 112 CMT="`git rev-parse --short $1`" 113 114 if [ -d "$TMPD/$CMT" ]; then 115 rm -rf $TMPD/$CMT 116 else 117 echo "$CMT not found" 118 fi 119 fi 120} 121 122[ $# -eq 0 ] && usage 123 124case "$1" in 125 record) 126 shift 127 dorecord $* 128 ;; 129 diff) 130 shift 131 dodiff $* 132 ;; 133 clean) 134 shift 135 doclean $* 136 ;; 137 *) 138 echo "Unrecognized command '$1'" 139 exit 1 140 ;; 141esac 142