1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
Description: Use Ubuntu-style build for Livepatch Generation
This patch changes the livepatch mechanism for Ubuntu. Instead of using
the kernel makefile directly, the build is performed using debian/rules,
so it matches how the Ubuntu kernel is actually made.
Author: Benjamin M Romer <benjamin.romer@canonical.com>
Last-Update: 2022-05-24
--- a/kpatch-build/kpatch-build
+++ b/kpatch-build/kpatch-build
@@ -175,12 +175,12 @@
for (( ; APPLIED_PATCHES>0; APPLIED_PATCHES-- )); do
idx=$(( APPLIED_PATCHES - 1))
patch="${PATCH_LIST[$idx]}"
- patch -p1 -R -d "$BUILDDIR" < "$patch" &> /dev/null
+ patch -p1 -R -d "$KERNEL_SRCDIR" < "$patch" &> /dev/null
done
# If $BUILDDIR was a git repo, make sure git actually sees that
# we've reverted our patch(es).
- [[ -d "$BUILDDIR/.git" ]] && (cd "$BUILDDIR" && git update-index -q --refresh)
+ [[ -d "$BUILDDIR/.git" ]] && (cd "$KERNEL_SRCDIR" && git update-index -q --refresh)
}
# List of kernel tree files that kpatch-build backed up to
@@ -897,7 +897,12 @@
fi
BUILDDIR="$OOT_MODULE_SRCDIR"
else
- BUILDDIR="$KERNEL_SRCDIR"
+ if [[ $DISTRO = ubuntu ]]; then
+ BUILDDIR="$TEMPDIR/build-generic"
+ mkdir -p "$BUILDDIR"
+ else
+ BUILDDIR="$KERNEL_SRCDIR"
+ fi
fi
[[ "$SKIPCLEANUP" -eq 0 ]] && trap cleanup EXIT INT TERM HUP
@@ -967,6 +972,12 @@
backup_kernel_file "vmlinux"
VMLINUX="$KERNEL_BACKUPDIR/vmlinux"
fi
+
+ # save debian before it gets removed with mrproper
+ if [[ -e "$SRCDIR/debian" ]]; then
+ cp -rf "$SRCDIR/debian" "$TEMPDIR/debian.bak"
+ fi
+
elif [[ -n "$OOT_MODULE" ]]; then
if [[ -z "${CONFIGFILE}" ]]; then
CONFIGFILE="/boot/config-${ARCHVERSION}"
@@ -1238,7 +1249,7 @@
fi
echo "Testing patch file(s)"
-cd "$BUILDDIR" || die
+cd "$KERNEL_SRCDIR" || die
verify_patch_files
apply_patches
remove_patches
@@ -1287,13 +1298,30 @@
MAKEVARS+=("LD=${KPATCH_CC_PREFIX}${LD}")
fi
+if [[ $DISTRO = ubuntu ]]; then
+ mv "$KERNEL_SRCDIR/debian" "$KERNEL_SRCDIR/debian.master" "$TEMPDIR"
+ make mrproper 2>&1 | logger || die
+ mv "$TEMPDIR/debian" "$TEMPDIR/debian.master" "$KERNEL_SRCDIR"
+ fakeroot debian/rules clean 2>&1 | logger || die
+ # shellcheck disable=SC1117
+ MAKEFLAGS="--no-print-directory" fakeroot \
+ debian/rules "${MAKEVARS[@]}" "-j$CPUS" \
+ build-generic build_image=vmlinux builddir="$TEMPDIR" \
+ enable_zfs=false 2>&1 | logger \
+ || die
+else
+ # $TARGETS used as list, no quotes.
+ # shellcheck disable=SC2086
+ make "${MAKEVARS[@]}" "-j$CPUS" $TARGETS 2>&1 | logger || die
+fi
-# $TARGETS used as list, no quotes.
-# shellcheck disable=SC2086
-make "${MAKEVARS[@]}" "-j$CPUS" $TARGETS 2>&1 | logger || die
+MODULE_SYMVERS="$KERNEL_SRCDIR/Module.symvers"
+if [[ "$DISTRO" = ubuntu ]]; then
+ MODULE_SYMVERS="$TEMPDIR/build-generic/Module.symvers"
+fi
# Save original module symvers
-cp -f "$BUILDDIR/Module.symvers" "$TEMPDIR/Module.symvers" || die
+cp -f "$MODULE_SYMVERS" "$TEMPDIR/Module.symvers" || die
echo "Building patched source"
apply_patches
@@ -1301,9 +1329,20 @@
export KPATCH_GCC_TEMPDIR="$TEMPDIR"
export KPATCH_GCC_SRCDIR="$BUILDDIR"
save_env
-# $TARGETS used as list, no quotes.
-# shellcheck disable=SC2086
-KBUILD_MODPOST_WARN=1 make "${MAKEVARS[@]}" "-j$CPUS" $TARGETS 2>&1 | logger || die
+
+if [[ $DISTRO = ubuntu ]]; then
+ rm -f debian/stamps/stamp-build-generic
+ # shellcheck disable=SC1117
+ MAKEFLAGS="--no-print-directory" fakeroot \
+ debian/rules "${MAKEVARS[@]}" "-j$CPUS" \
+ build-generic build_image=vmlinux builddir="$TEMPDIR" \
+ enable_zfs=false 2>&1 | logger \
+ || die
+else
+ # $TARGETS used as list, no quotes.
+ # shellcheck disable=SC2086
+ KBUILD_MODPOST_WARN=1 make "${MAKEVARS[@]}" "-j$CPUS" $TARGETS 2>&1 | logger || die
+fi
# source.c:(.section+0xFF): undefined reference to `symbol'
grep "undefined reference" "$LOGFILE" | sed -r "s/^.*\`(.*)'$/\\1/" \
@@ -1316,7 +1355,7 @@
die "no changed objects found"
fi
-grep -q vmlinux "$KERNEL_SRCDIR/Module.symvers" || die "truncated $KERNEL_SRCDIR/Module.symvers file"
+grep -q vmlinux "$MODULE_SYMVERS" || die "truncated $MODULE_SYMVERS file"
if [[ -n "$CONFIG_MODVERSIONS" ]]; then
trace_off "reading Module.symvers"
@@ -1467,13 +1506,6 @@
echo "Building patch module: $MODNAME.ko"
-if [[ -z "$USERSRCDIR" ]] && [[ "$DISTRO" = ubuntu ]]; then
- # UBUNTU: add UTS_UBUNTU_RELEASE_ABI to utsrelease.h after regenerating it
- UBUNTU_ABI="${ARCHVERSION#*-}"
- UBUNTU_ABI="${UBUNTU_ABI%-*}"
- echo "#define UTS_UBUNTU_RELEASE_ABI $UBUNTU_ABI" >> "$KERNEL_SRCDIR"/include/generated/utsrelease.h
-fi
-
cd "$TEMPDIR/output" || die
# $KPATCH_LDFLAGS and result of find used as list, no quotes.
# shellcheck disable=SC2086,SC2046
|