162306a36Sopenharmony_ci#!/bin/bash 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci# objdiff - a small script for validating that a commit or series of commits 562306a36Sopenharmony_ci# didn't change object code. 662306a36Sopenharmony_ci# 762306a36Sopenharmony_ci# Copyright 2014, Jason Cooper <jason@lakedaemon.net> 862306a36Sopenharmony_ci# 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci# usage example: 1162306a36Sopenharmony_ci# 1262306a36Sopenharmony_ci# $ git checkout COMMIT_A 1362306a36Sopenharmony_ci# $ <your fancy build command here> 1462306a36Sopenharmony_ci# $ ./scripts/objdiff record path/to/*.o 1562306a36Sopenharmony_ci# 1662306a36Sopenharmony_ci# $ git checkout COMMIT_B 1762306a36Sopenharmony_ci# $ <your fancy build command here> 1862306a36Sopenharmony_ci# $ ./scripts/objdiff record path/to/*.o 1962306a36Sopenharmony_ci# 2062306a36Sopenharmony_ci# $ ./scripts/objdiff diff COMMIT_A COMMIT_B 2162306a36Sopenharmony_ci# $ 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci# And to clean up (everything is in .objdiff/*) 2462306a36Sopenharmony_ci# $ ./scripts/objdiff clean all 2562306a36Sopenharmony_ci# 2662306a36Sopenharmony_ci# Note: 'make mrproper' will also remove .objdiff 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ciSRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ciif [ -z "$SRCTREE" ]; then 3162306a36Sopenharmony_ci echo >&2 "ERROR: Not a git repository." 3262306a36Sopenharmony_ci exit 1 3362306a36Sopenharmony_cifi 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ciTMPD=$SRCTREE/.objdiff 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ciusage() { 3862306a36Sopenharmony_ci echo >&2 "Usage: $0 <command> <args>" 3962306a36Sopenharmony_ci echo >&2 " record <list of object files or directories>" 4062306a36Sopenharmony_ci echo >&2 " diff <commitA> <commitB>" 4162306a36Sopenharmony_ci echo >&2 " clean all | <commit>" 4262306a36Sopenharmony_ci exit 1 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ciget_output_dir() { 4662306a36Sopenharmony_ci dir=${1%/*} 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci if [ "$dir" = "$1" ]; then 4962306a36Sopenharmony_ci dir=. 5062306a36Sopenharmony_ci fi 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci dir=$(cd $dir; pwd) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci echo $TMPD/$CMT${dir#$SRCTREE} 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cido_objdump() { 5862306a36Sopenharmony_ci dir=$(get_output_dir $1) 5962306a36Sopenharmony_ci base=${1##*/} 6062306a36Sopenharmony_ci stripped=$dir/${base%.o}.stripped 6162306a36Sopenharmony_ci dis=$dir/${base%.o}.dis 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci [ ! -d "$dir" ] && mkdir -p $dir 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci # remove addresses for a cleaner diff 6662306a36Sopenharmony_ci # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and 6762306a36Sopenharmony_ci $STRIP -g $1 -R __bug_table -R .note -R .comment -o $stripped 6862306a36Sopenharmony_ci $OBJDUMP -D $stripped | sed -e "s/^[[:space:]]\+[0-9a-f]\+//" -e "s:^$stripped:$1:" > $dis 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cidorecord() { 7262306a36Sopenharmony_ci [ $# -eq 0 ] && usage 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci FILES="$*" 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci CMT="`git rev-parse --short HEAD`" 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci STRIP="${CROSS_COMPILE}strip" 7962306a36Sopenharmony_ci OBJDUMP="${CROSS_COMPILE}objdump" 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci for d in $FILES; do 8262306a36Sopenharmony_ci if [ -d "$d" ]; then 8362306a36Sopenharmony_ci for f in $(find $d -name '*.o') 8462306a36Sopenharmony_ci do 8562306a36Sopenharmony_ci do_objdump $f 8662306a36Sopenharmony_ci done 8762306a36Sopenharmony_ci else 8862306a36Sopenharmony_ci do_objdump $d 8962306a36Sopenharmony_ci fi 9062306a36Sopenharmony_ci done 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cidodiff() { 9462306a36Sopenharmony_ci [ $# -ne 2 ] && [ $# -ne 0 ] && usage 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci if [ $# -eq 0 ]; then 9762306a36Sopenharmony_ci SRC="`git rev-parse --short HEAD^`" 9862306a36Sopenharmony_ci DST="`git rev-parse --short HEAD`" 9962306a36Sopenharmony_ci else 10062306a36Sopenharmony_ci SRC="`git rev-parse --short $1`" 10162306a36Sopenharmony_ci DST="`git rev-parse --short $2`" 10262306a36Sopenharmony_ci fi 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci DIFF="`which colordiff`" 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then 10762306a36Sopenharmony_ci DIFF="`which diff`" 10862306a36Sopenharmony_ci fi 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci SRCD="$TMPD/$SRC" 11162306a36Sopenharmony_ci DSTD="$TMPD/$DST" 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci if [ ! -d "$SRCD" ]; then 11462306a36Sopenharmony_ci echo >&2 "ERROR: $SRCD doesn't exist" 11562306a36Sopenharmony_ci exit 1 11662306a36Sopenharmony_ci fi 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci if [ ! -d "$DSTD" ]; then 11962306a36Sopenharmony_ci echo >&2 "ERROR: $DSTD doesn't exist" 12062306a36Sopenharmony_ci exit 1 12162306a36Sopenharmony_ci fi 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci $DIFF -Nurd $SRCD $DSTD 12462306a36Sopenharmony_ci} 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cidoclean() { 12762306a36Sopenharmony_ci [ $# -eq 0 ] && usage 12862306a36Sopenharmony_ci [ $# -gt 1 ] && usage 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci if [ "x$1" = "xall" ]; then 13162306a36Sopenharmony_ci rm -rf $TMPD/* 13262306a36Sopenharmony_ci else 13362306a36Sopenharmony_ci CMT="`git rev-parse --short $1`" 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci if [ -d "$TMPD/$CMT" ]; then 13662306a36Sopenharmony_ci rm -rf $TMPD/$CMT 13762306a36Sopenharmony_ci else 13862306a36Sopenharmony_ci echo >&2 "$CMT not found" 13962306a36Sopenharmony_ci fi 14062306a36Sopenharmony_ci fi 14162306a36Sopenharmony_ci} 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci[ $# -eq 0 ] && usage 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cicase "$1" in 14662306a36Sopenharmony_ci record) 14762306a36Sopenharmony_ci shift 14862306a36Sopenharmony_ci dorecord $* 14962306a36Sopenharmony_ci ;; 15062306a36Sopenharmony_ci diff) 15162306a36Sopenharmony_ci shift 15262306a36Sopenharmony_ci dodiff $* 15362306a36Sopenharmony_ci ;; 15462306a36Sopenharmony_ci clean) 15562306a36Sopenharmony_ci shift 15662306a36Sopenharmony_ci doclean $* 15762306a36Sopenharmony_ci ;; 15862306a36Sopenharmony_ci *) 15962306a36Sopenharmony_ci echo >&2 "Unrecognized command '$1'" 16062306a36Sopenharmony_ci exit 1 16162306a36Sopenharmony_ci ;; 16262306a36Sopenharmony_ciesac 163