xref: /rk3399_rockchip-uboot/scripts/objdiff (revision 598e2d33886568442ac52b60ae6f493158670e18)
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