1598e2d33SMasahiro Yamada#!/bin/bash 2598e2d33SMasahiro Yamada 3598e2d33SMasahiro Yamada# objdiff - a small script for validating that a commit or series of commits 4598e2d33SMasahiro Yamada# didn't change object code. 5598e2d33SMasahiro Yamada# 6598e2d33SMasahiro Yamada# Copyright 2014, Jason Cooper <jason@lakedaemon.net> 7598e2d33SMasahiro Yamada# 8598e2d33SMasahiro Yamada# Licensed under the terms of the GNU GPL version 2 9598e2d33SMasahiro Yamada 10598e2d33SMasahiro Yamada# usage example: 11598e2d33SMasahiro Yamada# 12598e2d33SMasahiro Yamada# $ git checkout COMMIT_A 13598e2d33SMasahiro Yamada# $ <your fancy build command here> 14598e2d33SMasahiro Yamada# $ ./scripts/objdiff record path/to/*.o 15598e2d33SMasahiro Yamada# 16598e2d33SMasahiro Yamada# $ git checkout COMMIT_B 17598e2d33SMasahiro Yamada# $ <your fancy build command here> 18598e2d33SMasahiro Yamada# $ ./scripts/objdiff record path/to/*.o 19598e2d33SMasahiro Yamada# 20598e2d33SMasahiro Yamada# $ ./scripts/objdiff diff COMMIT_A COMMIT_B 21598e2d33SMasahiro Yamada# $ 22598e2d33SMasahiro Yamada 23598e2d33SMasahiro Yamada# And to clean up (everything is in .tmp_objdiff/*) 24598e2d33SMasahiro Yamada# $ ./scripts/objdiff clean all 25598e2d33SMasahiro Yamada# 26598e2d33SMasahiro Yamada# Note: 'make mrproper' will also remove .tmp_objdiff 27598e2d33SMasahiro Yamada 289b586031SMasahiro YamadaSRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd) 29598e2d33SMasahiro Yamada 309b586031SMasahiro Yamadaif [ -z "$SRCTREE" ]; then 319b586031SMasahiro Yamada echo >&2 "ERROR: Not a git repository." 32598e2d33SMasahiro Yamada exit 1 33598e2d33SMasahiro Yamadafi 34598e2d33SMasahiro Yamada 359b586031SMasahiro YamadaTMPD=$SRCTREE/.tmp_objdiff 369b586031SMasahiro Yamada 37598e2d33SMasahiro Yamadausage() { 389b586031SMasahiro Yamada echo >&2 "Usage: $0 <command> <args>" 399b586031SMasahiro Yamada echo >&2 " record <list of object files or directories>" 409b586031SMasahiro Yamada echo >&2 " diff <commitA> <commitB>" 419b586031SMasahiro Yamada echo >&2 " clean all | <commit>" 42598e2d33SMasahiro Yamada exit 1 43598e2d33SMasahiro Yamada} 44598e2d33SMasahiro Yamada 459b586031SMasahiro Yamadaget_output_dir() { 469b586031SMasahiro Yamada dir=${1%/*} 479b586031SMasahiro Yamada 489b586031SMasahiro Yamada if [ "$dir" = "$1" ]; then 499b586031SMasahiro Yamada dir=. 509b586031SMasahiro Yamada fi 519b586031SMasahiro Yamada 529b586031SMasahiro Yamada dir=$(cd $dir; pwd) 539b586031SMasahiro Yamada 549b586031SMasahiro Yamada echo $TMPD/$CMT${dir#$SRCTREE} 559b586031SMasahiro Yamada} 569b586031SMasahiro Yamada 579b586031SMasahiro Yamadado_objdump() { 589b586031SMasahiro Yamada dir=$(get_output_dir $1) 599b586031SMasahiro Yamada base=${1##*/} 60*527d8655SStephen Boyd stripped=$dir/${base%.o}.stripped 619b586031SMasahiro Yamada dis=$dir/${base%.o}.dis 629b586031SMasahiro Yamada 639b586031SMasahiro Yamada [ ! -d "$dir" ] && mkdir -p $dir 649b586031SMasahiro Yamada 659b586031SMasahiro Yamada # remove addresses for a cleaner diff 669b586031SMasahiro Yamada # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and 67*527d8655SStephen Boyd $STRIP -g $1 -R __bug_table -R .note -R .comment -o $stripped 68*527d8655SStephen Boyd $OBJDUMP -D $stripped | sed -e "s/^[[:space:]]\+[0-9a-f]\+//" -e "s:^$stripped:$1:" > $dis 699b586031SMasahiro Yamada} 709b586031SMasahiro Yamada 71598e2d33SMasahiro Yamadadorecord() { 72598e2d33SMasahiro Yamada [ $# -eq 0 ] && usage 73598e2d33SMasahiro Yamada 74598e2d33SMasahiro Yamada FILES="$*" 75598e2d33SMasahiro Yamada 76598e2d33SMasahiro Yamada CMT="`git rev-parse --short HEAD`" 77598e2d33SMasahiro Yamada 78*527d8655SStephen Boyd STRIP="${CROSS_COMPILE}strip" 79598e2d33SMasahiro Yamada OBJDUMP="${CROSS_COMPILE}objdump" 80598e2d33SMasahiro Yamada 819b586031SMasahiro Yamada for d in $FILES; do 829b586031SMasahiro Yamada if [ -d "$d" ]; then 839b586031SMasahiro Yamada for f in $(find $d -name '*.o') 849b586031SMasahiro Yamada do 859b586031SMasahiro Yamada do_objdump $f 869b586031SMasahiro Yamada done 879b586031SMasahiro Yamada else 889b586031SMasahiro Yamada do_objdump $d 899b586031SMasahiro Yamada fi 90598e2d33SMasahiro Yamada done 91598e2d33SMasahiro Yamada} 92598e2d33SMasahiro Yamada 93598e2d33SMasahiro Yamadadodiff() { 94598e2d33SMasahiro Yamada [ $# -ne 2 ] && [ $# -ne 0 ] && usage 95598e2d33SMasahiro Yamada 96598e2d33SMasahiro Yamada if [ $# -eq 0 ]; then 97598e2d33SMasahiro Yamada SRC="`git rev-parse --short HEAD^`" 98598e2d33SMasahiro Yamada DST="`git rev-parse --short HEAD`" 99598e2d33SMasahiro Yamada else 100598e2d33SMasahiro Yamada SRC="`git rev-parse --short $1`" 101598e2d33SMasahiro Yamada DST="`git rev-parse --short $2`" 102598e2d33SMasahiro Yamada fi 103598e2d33SMasahiro Yamada 104598e2d33SMasahiro Yamada DIFF="`which colordiff`" 105598e2d33SMasahiro Yamada 106598e2d33SMasahiro Yamada if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then 107598e2d33SMasahiro Yamada DIFF="`which diff`" 108598e2d33SMasahiro Yamada fi 109598e2d33SMasahiro Yamada 110598e2d33SMasahiro Yamada SRCD="$TMPD/$SRC" 111598e2d33SMasahiro Yamada DSTD="$TMPD/$DST" 112598e2d33SMasahiro Yamada 113598e2d33SMasahiro Yamada if [ ! -d "$SRCD" ]; then 1149b586031SMasahiro Yamada echo >&2 "ERROR: $SRCD doesn't exist" 115598e2d33SMasahiro Yamada exit 1 116598e2d33SMasahiro Yamada fi 117598e2d33SMasahiro Yamada 118598e2d33SMasahiro Yamada if [ ! -d "$DSTD" ]; then 1199b586031SMasahiro Yamada echo >&2 "ERROR: $DSTD doesn't exist" 120598e2d33SMasahiro Yamada exit 1 121598e2d33SMasahiro Yamada fi 122598e2d33SMasahiro Yamada 123598e2d33SMasahiro Yamada $DIFF -Nurd $SRCD $DSTD 124598e2d33SMasahiro Yamada} 125598e2d33SMasahiro Yamada 126598e2d33SMasahiro Yamadadoclean() { 127598e2d33SMasahiro Yamada [ $# -eq 0 ] && usage 128598e2d33SMasahiro Yamada [ $# -gt 1 ] && usage 129598e2d33SMasahiro Yamada 130598e2d33SMasahiro Yamada if [ "x$1" = "xall" ]; then 131598e2d33SMasahiro Yamada rm -rf $TMPD/* 132598e2d33SMasahiro Yamada else 133598e2d33SMasahiro Yamada CMT="`git rev-parse --short $1`" 134598e2d33SMasahiro Yamada 135598e2d33SMasahiro Yamada if [ -d "$TMPD/$CMT" ]; then 136598e2d33SMasahiro Yamada rm -rf $TMPD/$CMT 137598e2d33SMasahiro Yamada else 1389b586031SMasahiro Yamada echo >&2 "$CMT not found" 139598e2d33SMasahiro Yamada fi 140598e2d33SMasahiro Yamada fi 141598e2d33SMasahiro Yamada} 142598e2d33SMasahiro Yamada 143598e2d33SMasahiro Yamada[ $# -eq 0 ] && usage 144598e2d33SMasahiro Yamada 145598e2d33SMasahiro Yamadacase "$1" in 146598e2d33SMasahiro Yamada record) 147598e2d33SMasahiro Yamada shift 148598e2d33SMasahiro Yamada dorecord $* 149598e2d33SMasahiro Yamada ;; 150598e2d33SMasahiro Yamada diff) 151598e2d33SMasahiro Yamada shift 152598e2d33SMasahiro Yamada dodiff $* 153598e2d33SMasahiro Yamada ;; 154598e2d33SMasahiro Yamada clean) 155598e2d33SMasahiro Yamada shift 156598e2d33SMasahiro Yamada doclean $* 157598e2d33SMasahiro Yamada ;; 158598e2d33SMasahiro Yamada *) 1599b586031SMasahiro Yamada echo >&2 "Unrecognized command '$1'" 160598e2d33SMasahiro Yamada exit 1 161598e2d33SMasahiro Yamada ;; 162598e2d33SMasahiro Yamadaesac 163