Created
March 26, 2019 20:10
-
-
Save eschulte/3e6791b1908572c42ca8591ad4d745a9 to your computer and use it in GitHub Desktop.
Use objdump to view the differences between two object files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# Usage: asm-diff [options] file1 file2 [-- diff options] | |
# Return the difference in the objudmp parsing of files | |
# | |
# OPTIONS: | |
# -o,--objdump CMD --- specify objdump command to use | |
# -j,--section NAME -- section to compare | |
# (default: .text) | |
# -c,--clean --------- specify whether to clean addresses | |
# -C,--really-clean -- specify whether to REALLY clean addresses | |
# -f,--fun-clean ----- clean function names | |
# -O,--objargs ARGS -- specify objdump args to use | |
# (default --no-show-raw-insn -d) | |
# (for data try -s) | |
# -s,--strip --------- strip before comparison | |
# -r,--ltrand-strip -- strip lt-rand symbols before comparison | |
# -u,--context NUM --- NUM lines of context | |
# (default: 2000) | |
# -d,--diffargs ARGS - specify diff args. Overrides context. | |
# (default: -uN) | |
# e.g., "-d '-y'" for side-by-side diff | |
SCRIPT="$0" | |
help(){ | |
local HELP_TEXT=$(cat "$SCRIPT" \ | |
|sed '/^[^#]/q' \ | |
|head -n -1 \ | |
|tail -n +3 \ | |
|sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' \ | |
|cut -c3-) | |
echo "$HELP_TEXT" | |
exit 1 | |
} | |
OBJDUMP=objdump | |
OBJDUMP_ARGS="--no-show-raw-insn -d" | |
SECTION=.text | |
CLEAN= | |
FN_CLEAN= | |
STRIP= | |
LTRAND_STRIP= | |
LEFT_STRIP= | |
RIGHT_STRIP= | |
CONTEXT=4 | |
DIFF_ARGS="-uN" | |
eval set -- $(getopt -o ho:j:cCfO:sru:d: -l help,objdump:,section:,clean,really-clean,fun-clean,objargs:,strip,ltrand-strip,context:,diffargs: -- "$@" || help;) | |
while [ $# -gt 0 ];do | |
case $1 in | |
-h|--help) help;; | |
-o|--objdump) OBJDUMP=$2; shift;; | |
-O|--objargs) OBJDUMP_ARGS=$2; shift;; | |
-j|--section) SECTION=$2; shift;; | |
-c|--clean) CLEAN=yes;; | |
-C|--really-clean) CLEAN=REALLY;; | |
-f|--fun-clean) FN_CLEAN=yes;; | |
-u|--context) CONTEXT=$2; shift;; | |
-d|--diffargs) DIFF_ARGS=$2; CONTEXT=""; shift;; | |
-s|--strip) STRIP=yes;; | |
-r|--ltrand-strip) LTRAND_STRIP=yes;; | |
(--) shift; break;; | |
(-*) error "unrecognized option $1";; | |
(*) break;; | |
esac | |
shift | |
done | |
if [ -z $1 ] || [ ! -f $1 ] || [ -z $2 ] || [ ! -f $2 ];then | |
help | |
else | |
LEFT=$1 | |
RIGHT=$2 | |
shift;shift; | |
fi | |
if [ ! -z $1 ];then | |
DIFF_ARGS=$@ | |
CONTEXT="" | |
fi | |
function exit_hook (){ | |
if [ -f $LEFT_STRIP ];then | |
rm -f $LEFT_STRIP; | |
fi | |
if [ -f $RIGHT_STRIP ];then | |
rm -f $RIGHT_STRIP; | |
fi | |
} | |
trap exit_hook SIGHUP SIGINT SIGTERM | |
if [ ! -z $STRIP ] || [ ! -z $LTRAND_STRIP ];then | |
LEFT_STRIP=$(mktemp $(basename $LEFT)-XXXXXX.strip) | |
RIGHT_STRIP=$(mktemp $(basename $RIGHT)-XXXXXX.strip) | |
if [ ! -z $STRIP ];then | |
STRIP_ARGS=-s | |
fi | |
if [ ! -z $LTRAND_STRIP ];then | |
STRIP_ARGS=-w --strip-symbol="__ltrand.*" | |
fi | |
strip $LEFT $STRIP_ARGS -o $LEFT_STRIP | |
strip $RIGHT $STRIP_ARGS -o $RIGHT_STRIP | |
LEFT=$LEFT_STRIP | |
RIGHT=$RIGHT_STRIP | |
fi | |
clean(){ | |
local SED_CMD='' | |
if [ ! -z $CLEAN ] || [ ! -z $FN_CLEAN ];then | |
SED_CMD+='s/[0-9a-f]\+\([: ]\)/ADDR\1/;' | |
SED_CMD+='s/\(callq\|jmp\|jmpq\|jne\|je\|js\)\( *\)[0-9a-f]\+/\1\2ADDR/;' | |
fi | |
if [ $CLEAN == REALLY ];then | |
SED_CMD+='s/[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]/ADDR/g;' | |
SED_CMD+='s/0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f](%rip)/0xADDR(%rip)/;' | |
SED_CMD+='s/0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f](%rip)/0xADDR(%rip)/;' | |
fi | |
if [ ! -z $FN_CLEAN ];then | |
SED_CMD+='s/<[^>]*>/<FUNCTION>/g;' | |
fi | |
cat -|sed "$SED_CMD" | |
} | |
if [ ! -z $CONTEXT ];then | |
CONTEXT="-U$CONTEXT" | |
fi | |
colordiff $DIFF_ARGS $CONTEXT \ | |
<($OBJDUMP $OBJDUMP_ARGS -j $SECTION $LEFT|clean) \ | |
<($OBJDUMP $OBJDUMP_ARGS -j $SECTION $RIGHT|clean) |tail -n+5 | |
exit_hook |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment