]>
Commit | Line | Data |
---|---|---|
79192ca8 JC |
1 | #!/bin/bash |
2 | ||
3 | # objdiff - a small script for validating that a commit or series of commits | |
4 | # didn't change object code. | |
5 | # | |
6 | # Copyright 2014, Jason Cooper <jason@lakedaemon.net> | |
7 | # | |
8 | # Licensed under the terms of the GNU GPL version 2 | |
9 | ||
10 | # usage example: | |
11 | # | |
12 | # $ git checkout COMMIT_A | |
13 | # $ <your fancy build command here> | |
14 | # $ ./scripts/objdiff record path/to/*.o | |
15 | # | |
16 | # $ git checkout COMMIT_B | |
17 | # $ <your fancy build command here> | |
18 | # $ ./scripts/objdiff record path/to/*.o | |
19 | # | |
20 | # $ ./scripts/objdiff diff COMMIT_A COMMIT_B | |
21 | # $ | |
22 | ||
23 | # And to clean up (everything is in .tmp_objdiff/*) | |
24 | # $ ./scripts/objdiff clean all | |
25 | # | |
26 | # Note: 'make mrproper' will also remove .tmp_objdiff | |
27 | ||
fd6e1242 | 28 | SRCTREE=$(git rev-parse --show-toplevel 2>/dev/null) |
79192ca8 | 29 | |
fd6e1242 MY |
30 | if [ -z "$SRCTREE" ]; then |
31 | echo "ERROR: Not a git repository." | |
79192ca8 JC |
32 | exit 1 |
33 | fi | |
34 | ||
fd6e1242 MY |
35 | TMPD=$SRCTREE/.tmp_objdiff |
36 | ||
79192ca8 JC |
37 | usage() { |
38 | echo "Usage: $0 <command> <args>" | |
39 | echo " record <list of object files>" | |
40 | echo " diff <commitA> <commitB>" | |
41 | echo " clean all | <commit>" | |
42 | exit 1 | |
43 | } | |
44 | ||
45 | dorecord() { | |
46 | [ $# -eq 0 ] && usage | |
47 | ||
48 | FILES="$*" | |
49 | ||
50 | CMT="`git rev-parse --short HEAD`" | |
51 | ||
52 | OBJDUMP="${CROSS_COMPILE}objdump" | |
53 | OBJDIFFD="$TMPD/$CMT" | |
54 | ||
55 | [ ! -d "$OBJDIFFD" ] && mkdir -p "$OBJDIFFD" | |
56 | ||
57 | for f in $FILES; do | |
58 | dn="${f%/*}" | |
59 | bn="${f##*/}" | |
60 | ||
61 | [ ! -d "$OBJDIFFD/$dn" ] && mkdir -p "$OBJDIFFD/$dn" | |
62 | ||
63 | # remove addresses for a more clear diff | |
64 | # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and | |
65 | $OBJDUMP -D "$f" | sed "s/^[[:space:]]\+[0-9a-f]\+//" \ | |
66 | >"$OBJDIFFD/$dn/$bn" | |
67 | done | |
68 | } | |
69 | ||
70 | dodiff() { | |
71 | [ $# -ne 2 ] && [ $# -ne 0 ] && usage | |
72 | ||
73 | if [ $# -eq 0 ]; then | |
74 | SRC="`git rev-parse --short HEAD^`" | |
75 | DST="`git rev-parse --short HEAD`" | |
76 | else | |
77 | SRC="`git rev-parse --short $1`" | |
78 | DST="`git rev-parse --short $2`" | |
79 | fi | |
80 | ||
81 | DIFF="`which colordiff`" | |
82 | ||
83 | if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then | |
84 | DIFF="`which diff`" | |
85 | fi | |
86 | ||
87 | SRCD="$TMPD/$SRC" | |
88 | DSTD="$TMPD/$DST" | |
89 | ||
90 | if [ ! -d "$SRCD" ]; then | |
91 | echo "ERROR: $SRCD doesn't exist" | |
92 | exit 1 | |
93 | fi | |
94 | ||
95 | if [ ! -d "$DSTD" ]; then | |
96 | echo "ERROR: $DSTD doesn't exist" | |
97 | exit 1 | |
98 | fi | |
99 | ||
100 | $DIFF -Nurd $SRCD $DSTD | |
101 | } | |
102 | ||
103 | doclean() { | |
104 | [ $# -eq 0 ] && usage | |
105 | [ $# -gt 1 ] && usage | |
106 | ||
107 | if [ "x$1" = "xall" ]; then | |
108 | rm -rf $TMPD/* | |
109 | else | |
110 | CMT="`git rev-parse --short $1`" | |
111 | ||
112 | if [ -d "$TMPD/$CMT" ]; then | |
113 | rm -rf $TMPD/$CMT | |
114 | else | |
115 | echo "$CMT not found" | |
116 | fi | |
117 | fi | |
118 | } | |
119 | ||
120 | [ $# -eq 0 ] && usage | |
121 | ||
122 | case "$1" in | |
123 | record) | |
124 | shift | |
125 | dorecord $* | |
126 | ;; | |
127 | diff) | |
128 | shift | |
129 | dodiff $* | |
130 | ;; | |
131 | clean) | |
132 | shift | |
133 | doclean $* | |
134 | ;; | |
135 | *) | |
136 | echo "Unrecognized command '$1'" | |
137 | exit 1 | |
138 | ;; | |
139 | esac |