diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build
index 61009f0..24647b4 100755
--- a/kpatch-build/kpatch-build
+++ b/kpatch-build/kpatch-build
@@ -713,8 +713,13 @@ export KPATCH_GCC_TEMPDIR
 CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " \
 	KBUILD_MODPOST_WARN=1 \
 	make "-j$CPUS" $TARGETS 2>&1 | logger || die
-grep "undefined reference" "$LOGFILE" | grep -qv kpatch_shadow && die
-grep "undefined!" "$LOGFILE" | grep -qv kpatch_shadow && die
+
+# source.c:(.section+0xFF): undefined reference to `symbol'
+grep "undefined reference" "$LOGFILE" | sed -r "s/^.*\`(.*)'$/\1/" \
+	>${TEMPDIR}/undefined_references
+
+# WARNING: "symbol" [path/to/module.ko] undefined!
+grep "undefined!" "$LOGFILE" | cut -d\" -f2 >>${TEMPDIR}/undefined_references
 
 if [[ ! -e "$TEMPDIR/changed_objs" ]]; then
 	die "no changed objects found"
@@ -854,6 +859,27 @@ if ! "$KPATCH_MODULE"; then
 	check_pipe_status create-klp-module
 fi
 
+readelf --wide --symbols "$TEMPDIR/patch/$MODNAME.ko" 2>/dev/null | \
+	awk '($4=="FUNC" || $4=="OBJECT") && ($5=="GLOBAL" || $5=="WEAK") && $7!="UND" {print $NF}' \
+	>${TEMPDIR}/new_symbols
+
+if "$KPATCH_MODULE"; then
+	cat >>${TEMPDIR}/new_symbols <<-EOF
+		kpatch_shadow_free
+		kpatch_shadow_alloc
+		kpatch_register
+		kpatch_shadow_get
+		kpatch_unregister
+		kpatch_root_kobj
+	EOF
+fi
+
+# Compare undefined_references and new_symbols files and print only the first
+# column containing lines unique to first file.
+UNDEFINED=$(comm -23 <(sort -u ${TEMPDIR}/undefined_references) \
+	<(sort -u ${TEMPDIR}/new_symbols) | tr '\n' ' ')
+[[ ! -z "$UNDEFINED" ]] && die "Undefined symbols: $UNDEFINED"
+
 cp -f "$TEMPDIR/patch/$MODNAME.ko" "$BASE" || die
 
 [[ "$DEBUG" -eq 0 ]] && rm -f "$LOGFILE"