Blame view

scripts/objdiff 2.85 KB
598e2d338   Masahiro Yamada   kbuild: sync with...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  #!/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
9b586031d   Masahiro Yamada   scripts: objdiff:...
27
  SRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd)
598e2d338   Masahiro Yamada   kbuild: sync with...
28

9b586031d   Masahiro Yamada   scripts: objdiff:...
29
30
  if [ -z "$SRCTREE" ]; then
  	echo >&2 "ERROR: Not a git repository."
598e2d338   Masahiro Yamada   kbuild: sync with...
31
32
  	exit 1
  fi
9b586031d   Masahiro Yamada   scripts: objdiff:...
33
  TMPD=$SRCTREE/.tmp_objdiff
598e2d338   Masahiro Yamada   kbuild: sync with...
34
  usage() {
9b586031d   Masahiro Yamada   scripts: objdiff:...
35
36
37
38
  	echo >&2 "Usage: $0 <command> <args>"
  	echo >&2 "  record    <list of object files or directories>"
  	echo >&2 "  diff      <commitA> <commitB>"
  	echo >&2 "  clean     all | <commit>"
598e2d338   Masahiro Yamada   kbuild: sync with...
39
40
  	exit 1
  }
9b586031d   Masahiro Yamada   scripts: objdiff:...
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  get_output_dir() {
  	dir=${1%/*}
  
  	if [ "$dir" = "$1" ]; then
  		dir=.
  	fi
  
  	dir=$(cd $dir; pwd)
  
  	echo $TMPD/$CMT${dir#$SRCTREE}
  }
  
  do_objdump() {
  	dir=$(get_output_dir $1)
  	base=${1##*/}
527d86558   Stephen Boyd   scripts: objdiff:...
56
  	stripped=$dir/${base%.o}.stripped
9b586031d   Masahiro Yamada   scripts: objdiff:...
57
58
59
60
61
62
  	dis=$dir/${base%.o}.dis
  
  	[ ! -d "$dir" ] && mkdir -p $dir
  
  	# remove addresses for a cleaner diff
  	# http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and
527d86558   Stephen Boyd   scripts: objdiff:...
63
64
  	$STRIP -g $1 -R __bug_table -R .note -R .comment -o $stripped
  	$OBJDUMP -D $stripped | sed -e "s/^[[:space:]]\+[0-9a-f]\+//" -e "s:^$stripped:$1:" > $dis
9b586031d   Masahiro Yamada   scripts: objdiff:...
65
  }
598e2d338   Masahiro Yamada   kbuild: sync with...
66
67
68
69
70
71
  dorecord() {
  	[ $# -eq 0 ] && usage
  
  	FILES="$*"
  
  	CMT="`git rev-parse --short HEAD`"
527d86558   Stephen Boyd   scripts: objdiff:...
72
  	STRIP="${CROSS_COMPILE}strip"
598e2d338   Masahiro Yamada   kbuild: sync with...
73
  	OBJDUMP="${CROSS_COMPILE}objdump"
598e2d338   Masahiro Yamada   kbuild: sync with...
74

9b586031d   Masahiro Yamada   scripts: objdiff:...
75
76
77
78
79
80
81
82
83
  	for d in $FILES; do
  		if [ -d "$d" ]; then
  			for f in $(find $d -name '*.o')
  			do
  				do_objdump $f
  			done
  		else
  			do_objdump $d
  		fi
598e2d338   Masahiro Yamada   kbuild: sync with...
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  	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
9b586031d   Masahiro Yamada   scripts: objdiff:...
108
  		echo >&2 "ERROR: $SRCD doesn't exist"
598e2d338   Masahiro Yamada   kbuild: sync with...
109
110
111
112
  		exit 1
  	fi
  
  	if [ ! -d "$DSTD" ]; then
9b586031d   Masahiro Yamada   scripts: objdiff:...
113
  		echo >&2 "ERROR: $DSTD doesn't exist"
598e2d338   Masahiro Yamada   kbuild: sync with...
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
  		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
9b586031d   Masahiro Yamada   scripts: objdiff:...
132
  			echo >&2 "$CMT not found"
598e2d338   Masahiro Yamada   kbuild: sync with...
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  		fi
  	fi
  }
  
  [ $# -eq 0 ] &&	usage
  
  case "$1" in
  	record)
  		shift
  		dorecord $*
  		;;
  	diff)
  		shift
  		dodiff $*
  		;;
  	clean)
  		shift
  		doclean $*
  		;;
  	*)
9b586031d   Masahiro Yamada   scripts: objdiff:...
153
  		echo >&2 "Unrecognized command '$1'"
598e2d338   Masahiro Yamada   kbuild: sync with...
154
155
156
  		exit 1
  		;;
  esac