179192ca8SJason Cooper#!/bin/bash 279192ca8SJason Cooper 379192ca8SJason Cooper# objdiff - a small script for validating that a commit or series of commits 479192ca8SJason Cooper# didn't change object code. 579192ca8SJason Cooper# 679192ca8SJason Cooper# Copyright 2014, Jason Cooper <jason@lakedaemon.net> 779192ca8SJason Cooper# 879192ca8SJason Cooper# Licensed under the terms of the GNU GPL version 2 979192ca8SJason Cooper 1079192ca8SJason Cooper# usage example: 1179192ca8SJason Cooper# 1279192ca8SJason Cooper# $ git checkout COMMIT_A 1379192ca8SJason Cooper# $ <your fancy build command here> 1479192ca8SJason Cooper# $ ./scripts/objdiff record path/to/*.o 1579192ca8SJason Cooper# 1679192ca8SJason Cooper# $ git checkout COMMIT_B 1779192ca8SJason Cooper# $ <your fancy build command here> 1879192ca8SJason Cooper# $ ./scripts/objdiff record path/to/*.o 1979192ca8SJason Cooper# 2079192ca8SJason Cooper# $ ./scripts/objdiff diff COMMIT_A COMMIT_B 2179192ca8SJason Cooper# $ 2279192ca8SJason Cooper 2379192ca8SJason Cooper# And to clean up (everything is in .tmp_objdiff/*) 2479192ca8SJason Cooper# $ ./scripts/objdiff clean all 2579192ca8SJason Cooper# 2679192ca8SJason Cooper# Note: 'make mrproper' will also remove .tmp_objdiff 2779192ca8SJason Cooper 28*18165efaSMasahiro YamadaSRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd) 2979192ca8SJason Cooper 30fd6e1242SMasahiro Yamadaif [ -z "$SRCTREE" ]; then 315ab370e9SMasahiro Yamada echo >&2 "ERROR: Not a git repository." 3279192ca8SJason Cooper exit 1 3379192ca8SJason Cooperfi 3479192ca8SJason Cooper 35fd6e1242SMasahiro YamadaTMPD=$SRCTREE/.tmp_objdiff 36fd6e1242SMasahiro Yamada 3779192ca8SJason Cooperusage() { 385ab370e9SMasahiro Yamada echo >&2 "Usage: $0 <command> <args>" 395ab370e9SMasahiro Yamada echo >&2 " record <list of object files>" 405ab370e9SMasahiro Yamada echo >&2 " diff <commitA> <commitB>" 415ab370e9SMasahiro Yamada echo >&2 " clean all | <commit>" 4279192ca8SJason Cooper exit 1 4379192ca8SJason Cooper} 4479192ca8SJason Cooper 45*18165efaSMasahiro Yamadaget_output_dir() { 46*18165efaSMasahiro Yamada dir=${1%/*} 47*18165efaSMasahiro Yamada 48*18165efaSMasahiro Yamada if [ "$dir" = "$1" ]; then 49*18165efaSMasahiro Yamada dir=. 50*18165efaSMasahiro Yamada fi 51*18165efaSMasahiro Yamada 52*18165efaSMasahiro Yamada dir=$(cd $dir; pwd) 53*18165efaSMasahiro Yamada 54*18165efaSMasahiro Yamada echo $TMPD/$CMT${dir#$SRCTREE} 55*18165efaSMasahiro Yamada} 56*18165efaSMasahiro Yamada 5779192ca8SJason Cooperdorecord() { 5879192ca8SJason Cooper [ $# -eq 0 ] && usage 5979192ca8SJason Cooper 6079192ca8SJason Cooper FILES="$*" 6179192ca8SJason Cooper 6279192ca8SJason Cooper CMT="`git rev-parse --short HEAD`" 6379192ca8SJason Cooper 6479192ca8SJason Cooper OBJDUMP="${CROSS_COMPILE}objdump" 6579192ca8SJason Cooper 6679192ca8SJason Cooper for f in $FILES; do 67*18165efaSMasahiro Yamada dir=$(get_output_dir $f) 6879192ca8SJason Cooper bn="${f##*/}" 6979192ca8SJason Cooper 70*18165efaSMasahiro Yamada [ ! -d "$dir" ] && mkdir -p $dir 7179192ca8SJason Cooper 7279192ca8SJason Cooper # remove addresses for a more clear diff 7379192ca8SJason Cooper # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and 74*18165efaSMasahiro Yamada $OBJDUMP -D $f | sed "s/^[[:space:]]\+[0-9a-f]\+//" > $dir/$bn 7579192ca8SJason Cooper done 7679192ca8SJason Cooper} 7779192ca8SJason Cooper 7879192ca8SJason Cooperdodiff() { 7979192ca8SJason Cooper [ $# -ne 2 ] && [ $# -ne 0 ] && usage 8079192ca8SJason Cooper 8179192ca8SJason Cooper if [ $# -eq 0 ]; then 8279192ca8SJason Cooper SRC="`git rev-parse --short HEAD^`" 8379192ca8SJason Cooper DST="`git rev-parse --short HEAD`" 8479192ca8SJason Cooper else 8579192ca8SJason Cooper SRC="`git rev-parse --short $1`" 8679192ca8SJason Cooper DST="`git rev-parse --short $2`" 8779192ca8SJason Cooper fi 8879192ca8SJason Cooper 8979192ca8SJason Cooper DIFF="`which colordiff`" 9079192ca8SJason Cooper 9179192ca8SJason Cooper if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then 9279192ca8SJason Cooper DIFF="`which diff`" 9379192ca8SJason Cooper fi 9479192ca8SJason Cooper 9579192ca8SJason Cooper SRCD="$TMPD/$SRC" 9679192ca8SJason Cooper DSTD="$TMPD/$DST" 9779192ca8SJason Cooper 9879192ca8SJason Cooper if [ ! -d "$SRCD" ]; then 995ab370e9SMasahiro Yamada echo >&2 "ERROR: $SRCD doesn't exist" 10079192ca8SJason Cooper exit 1 10179192ca8SJason Cooper fi 10279192ca8SJason Cooper 10379192ca8SJason Cooper if [ ! -d "$DSTD" ]; then 1045ab370e9SMasahiro Yamada echo >&2 "ERROR: $DSTD doesn't exist" 10579192ca8SJason Cooper exit 1 10679192ca8SJason Cooper fi 10779192ca8SJason Cooper 10879192ca8SJason Cooper $DIFF -Nurd $SRCD $DSTD 10979192ca8SJason Cooper} 11079192ca8SJason Cooper 11179192ca8SJason Cooperdoclean() { 11279192ca8SJason Cooper [ $# -eq 0 ] && usage 11379192ca8SJason Cooper [ $# -gt 1 ] && usage 11479192ca8SJason Cooper 11579192ca8SJason Cooper if [ "x$1" = "xall" ]; then 11679192ca8SJason Cooper rm -rf $TMPD/* 11779192ca8SJason Cooper else 11879192ca8SJason Cooper CMT="`git rev-parse --short $1`" 11979192ca8SJason Cooper 12079192ca8SJason Cooper if [ -d "$TMPD/$CMT" ]; then 12179192ca8SJason Cooper rm -rf $TMPD/$CMT 12279192ca8SJason Cooper else 1235ab370e9SMasahiro Yamada echo >&2 "$CMT not found" 12479192ca8SJason Cooper fi 12579192ca8SJason Cooper fi 12679192ca8SJason Cooper} 12779192ca8SJason Cooper 12879192ca8SJason Cooper[ $# -eq 0 ] && usage 12979192ca8SJason Cooper 13079192ca8SJason Coopercase "$1" in 13179192ca8SJason Cooper record) 13279192ca8SJason Cooper shift 13379192ca8SJason Cooper dorecord $* 13479192ca8SJason Cooper ;; 13579192ca8SJason Cooper diff) 13679192ca8SJason Cooper shift 13779192ca8SJason Cooper dodiff $* 13879192ca8SJason Cooper ;; 13979192ca8SJason Cooper clean) 14079192ca8SJason Cooper shift 14179192ca8SJason Cooper doclean $* 14279192ca8SJason Cooper ;; 14379192ca8SJason Cooper *) 1445ab370e9SMasahiro Yamada echo >&2 "Unrecognized command '$1'" 14579192ca8SJason Cooper exit 1 14679192ca8SJason Cooper ;; 14779192ca8SJason Cooperesac 148