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