18c2ecf20Sopenharmony_ci#!/bin/bash 28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci# objdiff - a small script for validating that a commit or series of commits 58c2ecf20Sopenharmony_ci# didn't change object code. 68c2ecf20Sopenharmony_ci# 78c2ecf20Sopenharmony_ci# Copyright 2014, Jason Cooper <jason@lakedaemon.net> 88c2ecf20Sopenharmony_ci# 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci# usage example: 118c2ecf20Sopenharmony_ci# 128c2ecf20Sopenharmony_ci# $ git checkout COMMIT_A 138c2ecf20Sopenharmony_ci# $ <your fancy build command here> 148c2ecf20Sopenharmony_ci# $ ./scripts/objdiff record path/to/*.o 158c2ecf20Sopenharmony_ci# 168c2ecf20Sopenharmony_ci# $ git checkout COMMIT_B 178c2ecf20Sopenharmony_ci# $ <your fancy build command here> 188c2ecf20Sopenharmony_ci# $ ./scripts/objdiff record path/to/*.o 198c2ecf20Sopenharmony_ci# 208c2ecf20Sopenharmony_ci# $ ./scripts/objdiff diff COMMIT_A COMMIT_B 218c2ecf20Sopenharmony_ci# $ 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci# And to clean up (everything is in .tmp_objdiff/*) 248c2ecf20Sopenharmony_ci# $ ./scripts/objdiff clean all 258c2ecf20Sopenharmony_ci# 268c2ecf20Sopenharmony_ci# Note: 'make mrproper' will also remove .tmp_objdiff 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ciSRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd) 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ciif [ -z "$SRCTREE" ]; then 318c2ecf20Sopenharmony_ci echo >&2 "ERROR: Not a git repository." 328c2ecf20Sopenharmony_ci exit 1 338c2ecf20Sopenharmony_cifi 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ciTMPD=$SRCTREE/.tmp_objdiff 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ciusage() { 388c2ecf20Sopenharmony_ci echo >&2 "Usage: $0 <command> <args>" 398c2ecf20Sopenharmony_ci echo >&2 " record <list of object files or directories>" 408c2ecf20Sopenharmony_ci echo >&2 " diff <commitA> <commitB>" 418c2ecf20Sopenharmony_ci echo >&2 " clean all | <commit>" 428c2ecf20Sopenharmony_ci exit 1 438c2ecf20Sopenharmony_ci} 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ciget_output_dir() { 468c2ecf20Sopenharmony_ci dir=${1%/*} 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci if [ "$dir" = "$1" ]; then 498c2ecf20Sopenharmony_ci dir=. 508c2ecf20Sopenharmony_ci fi 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci dir=$(cd $dir; pwd) 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci echo $TMPD/$CMT${dir#$SRCTREE} 558c2ecf20Sopenharmony_ci} 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_cido_objdump() { 588c2ecf20Sopenharmony_ci dir=$(get_output_dir $1) 598c2ecf20Sopenharmony_ci base=${1##*/} 608c2ecf20Sopenharmony_ci stripped=$dir/${base%.o}.stripped 618c2ecf20Sopenharmony_ci dis=$dir/${base%.o}.dis 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci [ ! -d "$dir" ] && mkdir -p $dir 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci # remove addresses for a cleaner diff 668c2ecf20Sopenharmony_ci # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and 678c2ecf20Sopenharmony_ci $STRIP -g $1 -R __bug_table -R .note -R .comment -o $stripped 688c2ecf20Sopenharmony_ci $OBJDUMP -D $stripped | sed -e "s/^[[:space:]]\+[0-9a-f]\+//" -e "s:^$stripped:$1:" > $dis 698c2ecf20Sopenharmony_ci} 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_cidorecord() { 728c2ecf20Sopenharmony_ci [ $# -eq 0 ] && usage 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci FILES="$*" 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci CMT="`git rev-parse --short HEAD`" 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci STRIP="${CROSS_COMPILE}strip" 798c2ecf20Sopenharmony_ci OBJDUMP="${CROSS_COMPILE}objdump" 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci for d in $FILES; do 828c2ecf20Sopenharmony_ci if [ -d "$d" ]; then 838c2ecf20Sopenharmony_ci for f in $(find $d -name '*.o') 848c2ecf20Sopenharmony_ci do 858c2ecf20Sopenharmony_ci do_objdump $f 868c2ecf20Sopenharmony_ci done 878c2ecf20Sopenharmony_ci else 888c2ecf20Sopenharmony_ci do_objdump $d 898c2ecf20Sopenharmony_ci fi 908c2ecf20Sopenharmony_ci done 918c2ecf20Sopenharmony_ci} 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cidodiff() { 948c2ecf20Sopenharmony_ci [ $# -ne 2 ] && [ $# -ne 0 ] && usage 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci if [ $# -eq 0 ]; then 978c2ecf20Sopenharmony_ci SRC="`git rev-parse --short HEAD^`" 988c2ecf20Sopenharmony_ci DST="`git rev-parse --short HEAD`" 998c2ecf20Sopenharmony_ci else 1008c2ecf20Sopenharmony_ci SRC="`git rev-parse --short $1`" 1018c2ecf20Sopenharmony_ci DST="`git rev-parse --short $2`" 1028c2ecf20Sopenharmony_ci fi 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci DIFF="`which colordiff`" 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then 1078c2ecf20Sopenharmony_ci DIFF="`which diff`" 1088c2ecf20Sopenharmony_ci fi 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci SRCD="$TMPD/$SRC" 1118c2ecf20Sopenharmony_ci DSTD="$TMPD/$DST" 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci if [ ! -d "$SRCD" ]; then 1148c2ecf20Sopenharmony_ci echo >&2 "ERROR: $SRCD doesn't exist" 1158c2ecf20Sopenharmony_ci exit 1 1168c2ecf20Sopenharmony_ci fi 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci if [ ! -d "$DSTD" ]; then 1198c2ecf20Sopenharmony_ci echo >&2 "ERROR: $DSTD doesn't exist" 1208c2ecf20Sopenharmony_ci exit 1 1218c2ecf20Sopenharmony_ci fi 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci $DIFF -Nurd $SRCD $DSTD 1248c2ecf20Sopenharmony_ci} 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_cidoclean() { 1278c2ecf20Sopenharmony_ci [ $# -eq 0 ] && usage 1288c2ecf20Sopenharmony_ci [ $# -gt 1 ] && usage 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci if [ "x$1" = "xall" ]; then 1318c2ecf20Sopenharmony_ci rm -rf $TMPD/* 1328c2ecf20Sopenharmony_ci else 1338c2ecf20Sopenharmony_ci CMT="`git rev-parse --short $1`" 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci if [ -d "$TMPD/$CMT" ]; then 1368c2ecf20Sopenharmony_ci rm -rf $TMPD/$CMT 1378c2ecf20Sopenharmony_ci else 1388c2ecf20Sopenharmony_ci echo >&2 "$CMT not found" 1398c2ecf20Sopenharmony_ci fi 1408c2ecf20Sopenharmony_ci fi 1418c2ecf20Sopenharmony_ci} 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci[ $# -eq 0 ] && usage 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_cicase "$1" in 1468c2ecf20Sopenharmony_ci record) 1478c2ecf20Sopenharmony_ci shift 1488c2ecf20Sopenharmony_ci dorecord $* 1498c2ecf20Sopenharmony_ci ;; 1508c2ecf20Sopenharmony_ci diff) 1518c2ecf20Sopenharmony_ci shift 1528c2ecf20Sopenharmony_ci dodiff $* 1538c2ecf20Sopenharmony_ci ;; 1548c2ecf20Sopenharmony_ci clean) 1558c2ecf20Sopenharmony_ci shift 1568c2ecf20Sopenharmony_ci doclean $* 1578c2ecf20Sopenharmony_ci ;; 1588c2ecf20Sopenharmony_ci *) 1598c2ecf20Sopenharmony_ci echo >&2 "Unrecognized command '$1'" 1608c2ecf20Sopenharmony_ci exit 1 1618c2ecf20Sopenharmony_ci ;; 1628c2ecf20Sopenharmony_ciesac 163