mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-07-05 21:35:46 +02:00

Prior to this commit, scripts/objdiff expected to be run at the top directory and only the relative path of objects. This commit provides more flexibility in terms of object path: [1] scripts/objdiff can be run in any directory For example, $ scripts/objdiff record init/main.o and $ cd init; ../scripts/objdiff record main.o produce the same result. [2] Support absolute path for objects $ scripts/objdiff record /home/foo/bar/linux/init/main.o work as well. Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com> Acked-by: Jason Cooper <jason@lakedaemon.net> Signed-off-by: Michal Marek <mmarek@suse.cz>
2.5 KiB
Executable File
2.5 KiB
Executable File
#!/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
$
$ ./scripts/objdiff record path/to/*.o
$ git checkout COMMIT_B
$
$ ./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 " echo >&2 " record " echo >&2 " diff " echo >&2 " clean all | " exit 1 }
get_output_dir() { dir=${1%/*}
if [ "$dir" = "$1" ]; then
dir=.
fi
dir=$(cd $dir; pwd)
echo $TMPD/$CMT${dir#$SRCTREE}
}
dorecord() { [ $# -eq 0 ] && usage
FILES="$*"
CMT="`git rev-parse --short HEAD`"
OBJDUMP="${CROSS_COMPILE}objdump"
for f in $FILES; do
dir=$(get_output_dir $f)
bn="${f##*/}"
[ ! -d "$dir" ] && mkdir -p $dir
# remove addresses for a more clear diff
# http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and
$OBJDUMP -D $f | sed "s/^[[:space:]]\+[0-9a-f]\+//" > $dir/$bn
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