Commit | Line | Data |
---|---|---|
79192ca8 | 1 | #!/bin/bash |
958349cc | 2 | # SPDX-License-Identifier: GPL-2.0-only |
79192ca8 JC |
3 | |
4 | # objdiff - a small script for validating that a commit or series of commits | |
5 | # didn't change object code. | |
6 | # | |
7 | # Copyright 2014, Jason Cooper <jason@lakedaemon.net> | |
8 | # | |
79192ca8 JC |
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 | ||
b0d6207b | 23 | # And to clean up (everything is in .objdiff/*) |
79192ca8 JC |
24 | # $ ./scripts/objdiff clean all |
25 | # | |
b0d6207b | 26 | # Note: 'make mrproper' will also remove .objdiff |
79192ca8 | 27 | |
18165efa | 28 | SRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd) |
79192ca8 | 29 | |
fd6e1242 | 30 | if [ -z "$SRCTREE" ]; then |
5ab370e9 | 31 | echo >&2 "ERROR: Not a git repository." |
79192ca8 JC |
32 | exit 1 |
33 | fi | |
34 | ||
b0d6207b | 35 | TMPD=$SRCTREE/.objdiff |
fd6e1242 | 36 | |
79192ca8 | 37 | usage() { |
5ab370e9 | 38 | echo >&2 "Usage: $0 <command> <args>" |
7fa0e6db | 39 | echo >&2 " record <list of object files or directories>" |
5ab370e9 MY |
40 | echo >&2 " diff <commitA> <commitB>" |
41 | echo >&2 " clean all | <commit>" | |
79192ca8 JC |
42 | exit 1 |
43 | } | |
44 | ||
18165efa MY |
45 | get_output_dir() { |
46 | dir=${1%/*} | |
47 | ||
48 | if [ "$dir" = "$1" ]; then | |
49 | dir=. | |
50 | fi | |
51 | ||
52 | dir=$(cd $dir; pwd) | |
53 | ||
54 | echo $TMPD/$CMT${dir#$SRCTREE} | |
55 | } | |
56 | ||
7fa0e6db MY |
57 | do_objdump() { |
58 | dir=$(get_output_dir $1) | |
59 | base=${1##*/} | |
65ba6fa4 | 60 | stripped=$dir/${base%.o}.stripped |
7fa0e6db MY |
61 | dis=$dir/${base%.o}.dis |
62 | ||
63 | [ ! -d "$dir" ] && mkdir -p $dir | |
64 | ||
65 | # remove addresses for a cleaner diff | |
66 | # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and | |
65ba6fa4 SB |
67 | $STRIP -g $1 -R __bug_table -R .note -R .comment -o $stripped |
68 | $OBJDUMP -D $stripped | sed -e "s/^[[:space:]]\+[0-9a-f]\+//" -e "s:^$stripped:$1:" > $dis | |
7fa0e6db MY |
69 | } |
70 | ||
79192ca8 JC |
71 | dorecord() { |
72 | [ $# -eq 0 ] && usage | |
73 | ||
74 | FILES="$*" | |
75 | ||
76 | CMT="`git rev-parse --short HEAD`" | |
77 | ||
65ba6fa4 | 78 | STRIP="${CROSS_COMPILE}strip" |
79192ca8 | 79 | OBJDUMP="${CROSS_COMPILE}objdump" |
79192ca8 | 80 | |
7fa0e6db MY |
81 | for d in $FILES; do |
82 | if [ -d "$d" ]; then | |
83 | for f in $(find $d -name '*.o') | |
84 | do | |
85 | do_objdump $f | |
86 | done | |
87 | else | |
88 | do_objdump $d | |
89 | fi | |
79192ca8 JC |
90 | done |
91 | } | |
92 | ||
93 | dodiff() { | |
94 | [ $# -ne 2 ] && [ $# -ne 0 ] && usage | |
95 | ||
96 | if [ $# -eq 0 ]; then | |
97 | SRC="`git rev-parse --short HEAD^`" | |
98 | DST="`git rev-parse --short HEAD`" | |
99 | else | |
100 | SRC="`git rev-parse --short $1`" | |
101 | DST="`git rev-parse --short $2`" | |
102 | fi | |
103 | ||
104 | DIFF="`which colordiff`" | |
105 | ||
106 | if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then | |
107 | DIFF="`which diff`" | |
108 | fi | |
109 | ||
110 | SRCD="$TMPD/$SRC" | |
111 | DSTD="$TMPD/$DST" | |
112 | ||
113 | if [ ! -d "$SRCD" ]; then | |
5ab370e9 | 114 | echo >&2 "ERROR: $SRCD doesn't exist" |
79192ca8 JC |
115 | exit 1 |
116 | fi | |
117 | ||
118 | if [ ! -d "$DSTD" ]; then | |
5ab370e9 | 119 | echo >&2 "ERROR: $DSTD doesn't exist" |
79192ca8 JC |
120 | exit 1 |
121 | fi | |
122 | ||
123 | $DIFF -Nurd $SRCD $DSTD | |
124 | } | |
125 | ||
126 | doclean() { | |
127 | [ $# -eq 0 ] && usage | |
128 | [ $# -gt 1 ] && usage | |
129 | ||
130 | if [ "x$1" = "xall" ]; then | |
131 | rm -rf $TMPD/* | |
132 | else | |
133 | CMT="`git rev-parse --short $1`" | |
134 | ||
135 | if [ -d "$TMPD/$CMT" ]; then | |
136 | rm -rf $TMPD/$CMT | |
137 | else | |
5ab370e9 | 138 | echo >&2 "$CMT not found" |
79192ca8 JC |
139 | fi |
140 | fi | |
141 | } | |
142 | ||
143 | [ $# -eq 0 ] && usage | |
144 | ||
145 | case "$1" in | |
146 | record) | |
147 | shift | |
148 | dorecord $* | |
149 | ;; | |
150 | diff) | |
151 | shift | |
152 | dodiff $* | |
153 | ;; | |
154 | clean) | |
155 | shift | |
156 | doclean $* | |
157 | ;; | |
158 | *) | |
5ab370e9 | 159 | echo >&2 "Unrecognized command '$1'" |
79192ca8 JC |
160 | exit 1 |
161 | ;; | |
162 | esac |