forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
2.8 KiB
162 lines
2.8 KiB
#!/bin/bash |
|
# SPDX-License-Identifier: GPL-2.0-only |
|
|
|
# objdiff - a small script for validating that a commit or series of commits |
|
# didn't change object code. |
|
# |
|
# Copyright 2014, Jason Cooper <[email protected]> |
|
# |
|
|
|
# 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 |
|
|
|
SRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd) |
|
|
|
if [ -z "$SRCTREE" ]; then |
|
echo >&2 "ERROR: Not a git repository." |
|
exit 1 |
|
fi |
|
|
|
TMPD=$SRCTREE/.tmp_objdiff |
|
|
|
usage() { |
|
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>" |
|
exit 1 |
|
} |
|
|
|
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##*/} |
|
stripped=$dir/${base%.o}.stripped |
|
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 |
|
$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 |
|
} |
|
|
|
dorecord() { |
|
[ $# -eq 0 ] && usage |
|
|
|
FILES="$*" |
|
|
|
CMT="`git rev-parse --short HEAD`" |
|
|
|
STRIP="${CROSS_COMPILE}strip" |
|
OBJDUMP="${CROSS_COMPILE}objdump" |
|
|
|
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 |
|
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 >&2 "ERROR: $SRCD doesn't exist" |
|
exit 1 |
|
fi |
|
|
|
if [ ! -d "$DSTD" ]; then |
|
echo >&2 "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 >&2 "$CMT not found" |
|
fi |
|
fi |
|
} |
|
|
|
[ $# -eq 0 ] && usage |
|
|
|
case "$1" in |
|
record) |
|
shift |
|
dorecord $* |
|
;; |
|
diff) |
|
shift |
|
dodiff $* |
|
;; |
|
clean) |
|
shift |
|
doclean $* |
|
;; |
|
*) |
|
echo >&2 "Unrecognized command '$1'" |
|
exit 1 |
|
;; |
|
esac
|
|
|