Blame test/difftree.sh

Packit c71e3f
#!/bin/bash
Packit c71e3f
Packit c71e3f
# The purpose of this test script is to determine if create-diff-object can
Packit c71e3f
# properly recognize object file equivalence when passed the same file for both
Packit c71e3f
# the original and patched objects.  This verifies that create-diff-object is
Packit c71e3f
# correctly parsing, correlating, and comparing the different elements of the
Packit c71e3f
# object file.  In practice, a situation similar to the test case occurs when a
Packit c71e3f
# commonly included header file changes, causing Make to rebuild many objects
Packit c71e3f
# that have no functional change.
Packit c71e3f
Packit c71e3f
# This script requires a built kernel object tree to be in the kpatch cache
Packit c71e3f
# directory at $HOME/.kpatch/obj
Packit c71e3f
Packit c71e3f
#set -x
Packit c71e3f
Packit c71e3f
OBJDIR="$HOME/.kpatch/obj"
Packit c71e3f
SCRIPTDIR="$(readlink -f $(dirname $(type -p $0)))"
Packit c71e3f
TEMPDIR=$(mktemp -d)
Packit c71e3f
RESULTSDIR="$TEMPDIR/results"
Packit c71e3f
VMVLINUX="/usr/lib/debug/lib/modules/$(uname -r)/vmlinux" # path for F20
Packit c71e3f
Packit c71e3f
if [[ ! -d $OBJDIR ]]; then
Packit c71e3f
	echo "please run kpatch-build to populate the object tree in $OBJDIR"
Packit c71e3f
fi
Packit c71e3f
Packit c71e3f
cd "$OBJDIR" || exit 1
Packit c71e3f
for i in $(find * -name '*.o')
Packit c71e3f
do
Packit c71e3f
	# copied from kpatch-build/kpatch-gcc; keep in sync
Packit c71e3f
	case $i in
Packit c71e3f
		*.mod.o|\
Packit c71e3f
		*built-in.o|\
Packit c71e3f
		*built-in.a|\
Packit c71e3f
		vmlinux.o|\
Packit c71e3f
		.tmp_kallsyms1.o|\
Packit c71e3f
		.tmp_kallsyms2.o|\
Packit c71e3f
		init/version.o|\
Packit c71e3f
		arch/x86/boot/version.o|\
Packit c71e3f
		arch/x86/boot/compressed/eboot.o|\
Packit c71e3f
		arch/x86/boot/header.o|\
Packit c71e3f
		arch/x86/boot/compressed/efi_stub_64.o|\
Packit c71e3f
		arch/x86/boot/compressed/piggy.o|\
Packit c71e3f
		kernel/system_certificates.o|\
Packit c71e3f
		.*.o)
Packit c71e3f
		continue
Packit c71e3f
		;;
Packit c71e3f
	esac
Packit c71e3f
	# skip objects that are the linked product of more than one object file
Packit c71e3f
	[[ $(eu-readelf -s $i | grep FILE | wc -l) -ne 1 ]] && continue
Packit c71e3f
	$SCRIPTDIR/../kpatch-build/create-diff-object $i $i /usr/lib/debug/lib/modules/$(uname -r)/vmlinux "$TEMPDIR/output.o" > "$TEMPDIR/log.txt" 2>&1
Packit c71e3f
	RETCODE=$?
Packit c71e3f
	# expect RETCODE to be 3 indicating no change
Packit c71e3f
	[[ $RETCODE -eq 3 ]] && continue
Packit c71e3f
	# otherwise record error
Packit c71e3f
	mkdir -p $RESULTSDIR/$(dirname $i) || exit 1
Packit c71e3f
	cp "$i" "$RESULTSDIR/$i" || exit 1
Packit c71e3f
	case $RETCODE in
Packit c71e3f
		139)
Packit c71e3f
			echo "$i: segfault" | tee 
Packit c71e3f
			if [[ ! -e core ]]; then
Packit c71e3f
				echo "no corefile, run "ulimit -c unlimited" to capture corefile"
Packit c71e3f
			else
Packit c71e3f
				mv core "$RESULTSDIR/$i.core" || exit 1
Packit c71e3f
			fi
Packit c71e3f
			;;
Packit c71e3f
		0)
Packit c71e3f
			echo "$i: incorrectly detected change"
Packit c71e3f
			mv "$TEMPDIR/log.txt" "$RESULTSDIR/$i.log" || exit 1
Packit c71e3f
			;;
Packit c71e3f
		1|2)
Packit c71e3f
			echo "$i: error code $RETCODE"
Packit c71e3f
			mv "$TEMPDIR/log.txt" "$RESULTSDIR/$i.log" || exit 1
Packit c71e3f
			;;
Packit c71e3f
		*)
Packit c71e3f
			exit 1 # script error
Packit c71e3f
			;;
Packit c71e3f
	esac
Packit c71e3f
done
Packit c71e3f
rm -f "$TEMPDIR/log.txt" > /dev/null 2>&1
Packit c71e3f
Packit c71e3f
# try to group the errors together in some meaningful way
Packit c71e3f
cd "$RESULTSDIR" || exit 1
Packit c71e3f
echo ""
Packit c71e3f
echo "Results:"
Packit c71e3f
for i in $(find * -iname '*.log')
Packit c71e3f
do
Packit c71e3f
	echo $(cat $i | head -1 | cut -f2-3 -d':')
Packit c71e3f
done | sort | uniq -c | sort -n -r | tee "$TEMPDIR/results.log"
Packit c71e3f
Packit c71e3f
echo "results are in $TEMPDIR"