142 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			142 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
								 | 
							
								#!/bin/bash
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# objdiff - a small script for validating that a commit or series of commits
							 | 
						||
| 
								 | 
							
								# didn't change object code.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Copyright 2014, Jason Cooper <jason@lakedaemon.net>
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Licensed under the terms of the GNU GPL version 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# usage example:
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# $ git checkout COMMIT_A
							 | 
						||
| 
								 | 
							
								# $ <your fancy build command here>
							 | 
						||
| 
								 | 
							
								# $ ./scripts/objdiff record path/to/*.o
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# $ git checkout COMMIT_B
							 | 
						||
| 
								 | 
							
								# $ <your fancy build command here>
							 | 
						||
| 
								 | 
							
								# $ ./scripts/objdiff record path/to/*.o
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# $ ./scripts/objdiff diff COMMIT_A COMMIT_B
							 | 
						||
| 
								 | 
							
								# $
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# And to clean up (everything is in .tmp_objdiff/*)
							 | 
						||
| 
								 | 
							
								# $ ./scripts/objdiff clean all
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Note: 'make mrproper' will also remove .tmp_objdiff
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								GIT_DIR="`git rev-parse --git-dir`"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if [ -d "$GIT_DIR" ]; then
							 | 
						||
| 
								 | 
							
									TMPD="${GIT_DIR%git}tmp_objdiff"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									[ -d "$TMPD" ] || mkdir "$TMPD"
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
									echo "ERROR: git directory not found."
							 | 
						||
| 
								 | 
							
									exit 1
							 | 
						||
| 
								 | 
							
								fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								usage() {
							 | 
						||
| 
								 | 
							
									echo "Usage: $0 <command> <args>"
							 | 
						||
| 
								 | 
							
									echo "  record    <list of object files>"
							 | 
						||
| 
								 | 
							
									echo "  diff      <commitA> <commitB>"
							 | 
						||
| 
								 | 
							
									echo "  clean     all | <commit>"
							 | 
						||
| 
								 | 
							
									exit 1
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								dorecord() {
							 | 
						||
| 
								 | 
							
									[ $# -eq 0 ] && usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									FILES="$*"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									CMT="`git rev-parse --short HEAD`"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									OBJDUMP="${CROSS_COMPILE}objdump"
							 | 
						||
| 
								 | 
							
									OBJDIFFD="$TMPD/$CMT"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									[ ! -d "$OBJDIFFD" ] && mkdir -p "$OBJDIFFD"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for f in $FILES; do
							 | 
						||
| 
								 | 
							
										dn="${f%/*}"
							 | 
						||
| 
								 | 
							
										bn="${f##*/}"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										[ ! -d "$OBJDIFFD/$dn" ] && mkdir -p "$OBJDIFFD/$dn"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										# remove addresses for a more clear diff
							 | 
						||
| 
								 | 
							
										# http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and
							 | 
						||
| 
								 | 
							
										$OBJDUMP -D "$f" | sed "s/^[[:space:]]\+[0-9a-f]\+//" \
							 | 
						||
| 
								 | 
							
											>"$OBJDIFFD/$dn/$bn"
							 | 
						||
| 
								 | 
							
									done
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								dodiff() {
							 | 
						||
| 
								 | 
							
									[ $# -ne 2 ] && [ $# -ne 0 ] && usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if [ $# -eq 0 ]; then
							 | 
						||
| 
								 | 
							
										SRC="`git rev-parse --short HEAD^`"
							 | 
						||
| 
								 | 
							
										DST="`git rev-parse --short HEAD`"
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										SRC="`git rev-parse --short $1`"
							 | 
						||
| 
								 | 
							
										DST="`git rev-parse --short $2`"
							 | 
						||
| 
								 | 
							
									fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									DIFF="`which colordiff`"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then
							 | 
						||
| 
								 | 
							
										DIFF="`which diff`"
							 | 
						||
| 
								 | 
							
									fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									SRCD="$TMPD/$SRC"
							 | 
						||
| 
								 | 
							
									DSTD="$TMPD/$DST"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if [ ! -d "$SRCD" ]; then
							 | 
						||
| 
								 | 
							
										echo "ERROR: $SRCD doesn't exist"
							 | 
						||
| 
								 | 
							
										exit 1
							 | 
						||
| 
								 | 
							
									fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if [ ! -d "$DSTD" ]; then
							 | 
						||
| 
								 | 
							
										echo "ERROR: $DSTD doesn't exist"
							 | 
						||
| 
								 | 
							
										exit 1
							 | 
						||
| 
								 | 
							
									fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									$DIFF -Nurd $SRCD $DSTD
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								doclean() {
							 | 
						||
| 
								 | 
							
									[ $# -eq 0 ] && usage
							 | 
						||
| 
								 | 
							
									[ $# -gt 1 ] && usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if [ "x$1" = "xall" ]; then
							 | 
						||
| 
								 | 
							
										rm -rf $TMPD/*
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										CMT="`git rev-parse --short $1`"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if [ -d "$TMPD/$CMT" ]; then
							 | 
						||
| 
								 | 
							
											rm -rf $TMPD/$CMT
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
											echo "$CMT not found"
							 | 
						||
| 
								 | 
							
										fi
							 | 
						||
| 
								 | 
							
									fi
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[ $# -eq 0 ] &&	usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								case "$1" in
							 | 
						||
| 
								 | 
							
									record)
							 | 
						||
| 
								 | 
							
										shift
							 | 
						||
| 
								 | 
							
										dorecord $*
							 | 
						||
| 
								 | 
							
										;;
							 | 
						||
| 
								 | 
							
									diff)
							 | 
						||
| 
								 | 
							
										shift
							 | 
						||
| 
								 | 
							
										dodiff $*
							 | 
						||
| 
								 | 
							
										;;
							 | 
						||
| 
								 | 
							
									clean)
							 | 
						||
| 
								 | 
							
										shift
							 | 
						||
| 
								 | 
							
										doclean $*
							 | 
						||
| 
								 | 
							
										;;
							 | 
						||
| 
								 | 
							
									*)
							 | 
						||
| 
								 | 
							
										echo "Unrecognized command '$1'"
							 | 
						||
| 
								 | 
							
										exit 1
							 | 
						||
| 
								 | 
							
										;;
							 | 
						||
| 
								 | 
							
								esac
							 |