Undefined reference failure logic rework

Don't die outright when encountering an 'undefined reference' error,
instead write those down and check if needed symbols are provided by the
resulting module or core kpatch module.

Fixes #783.

v2:
  - make undefined_references and new_symbols unique before comparing
  - remove leftover $KMOD_PATH from new_symbols readelf

Signed-off-by: Artem Savkov <asavkov@redhat.com>
This commit is contained in:
Artem Savkov 2018-03-14 10:37:10 +01:00
parent bb088de342
commit 2ac206b3ba

View File

@ -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"