2024-03-02 00:18:20 +08:00
|
|
|
From 5f97ec32a8a98810811949ea9feeefe583a0fbd3 Mon Sep 17 00:00:00 2001
|
2021-11-16 12:10:06 +08:00
|
|
|
From: Zhipeng Xie <xiezhipeng1@huawei.com>
|
|
|
|
|
Date: Wed, 26 Feb 2020 06:44:06 -0500
|
2024-03-02 00:18:20 +08:00
|
|
|
Subject: [PATCH 08/38] kpatch-build: enhance for out of tree module
|
2021-11-16 12:10:06 +08:00
|
|
|
|
|
|
|
|
support set USERMODBUILDDIR to build patch for out
|
|
|
|
|
of tree module.
|
|
|
|
|
|
|
|
|
|
Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
|
|
|
|
|
---
|
2024-03-02 00:18:20 +08:00
|
|
|
kpatch-build/kpatch-build | 56 +++++++++++++++++++++++++++++++--------
|
2021-11-16 12:10:06 +08:00
|
|
|
kpatch-build/kpatch-cc | 4 ++-
|
2024-03-02 00:18:20 +08:00
|
|
|
2 files changed, 48 insertions(+), 12 deletions(-)
|
2021-11-16 12:10:06 +08:00
|
|
|
|
|
|
|
|
diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build
|
2024-03-02 00:18:20 +08:00
|
|
|
index 7f3bbce..8bd721b 100755
|
2021-11-16 12:10:06 +08:00
|
|
|
--- a/kpatch-build/kpatch-build
|
|
|
|
|
+++ b/kpatch-build/kpatch-build
|
2024-03-02 00:18:20 +08:00
|
|
|
@@ -571,6 +571,12 @@ find_parent_obj() {
|
|
|
|
|
[[ -n "$PARENT" ]] && return
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
+ # try to find parent in OOT Module directory
|
|
|
|
|
+ if [[ -n "$USERMODBUILDDIR" ]]; then
|
|
|
|
|
+ find_parent_obj_in_dir "$file" "$USERMODBUILDDIR"
|
|
|
|
|
+ [[ -n "$PARENT" ]] && return
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
# prevent known deep finds
|
|
|
|
|
if [[ $file = drivers/gpu/drm/amd/* ]]; then
|
|
|
|
|
find_parent_obj_in_dir "$file" "drivers/gpu/drm/amd/amdgpu"
|
|
|
|
|
@@ -789,6 +795,11 @@ if [[ -n "$SRCRPM" ]]; then
|
2021-11-16 12:10:06 +08:00
|
|
|
ARCHVERSION="${ARCHVERSION#alt-}"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
+if [[ -n "$USERMODBUILDDIR" ]]; then
|
|
|
|
|
+ OOT_MODULE="yes"
|
2024-03-02 00:18:20 +08:00
|
|
|
+ OOT_MODULE_SRCDIR=$USERMODBUILDDIR
|
2021-11-16 12:10:06 +08:00
|
|
|
+fi
|
|
|
|
|
+
|
2024-03-02 00:18:20 +08:00
|
|
|
if [[ -n "$OOT_MODULE" ]] && [[ -z "$OOT_MODULE_SRCDIR" ]]; then
|
2023-01-30 16:10:43 +08:00
|
|
|
warn "--oot-module requires --oot-module-src"
|
2021-11-16 12:10:06 +08:00
|
|
|
exit 1
|
2024-03-02 00:18:20 +08:00
|
|
|
@@ -819,7 +830,7 @@ if [[ -n "$USERSRCDIR" ]]; then
|
2021-11-16 12:10:06 +08:00
|
|
|
fi
|
2023-01-30 16:10:43 +08:00
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
-if [[ -n "$OOT_MODULE" ]]; then
|
|
|
|
|
+if [[ -n "$OOT_MODULE" ]] && [[ "$OOT_MODULE" != "yes" ]]; then
|
|
|
|
|
ARCHVERSION="$(modinfo -F vermagic "$OOT_MODULE" | awk '{print $1}')"
|
|
|
|
|
fi
|
2021-11-16 12:10:06 +08:00
|
|
|
|
2024-03-02 00:18:20 +08:00
|
|
|
@@ -868,7 +879,7 @@ fi
|
2021-11-16 12:10:06 +08:00
|
|
|
|
|
|
|
|
[[ "$ARCHVERSION" =~ .el7a. ]] && ALT="-alt"
|
|
|
|
|
|
|
|
|
|
-[[ -z "$TARGETS" ]] && TARGETS="vmlinux modules"
|
2024-03-02 00:18:20 +08:00
|
|
|
+[[ -z "$TARGETS" ]] && [[ -z "$OOT_MODULE" ]] && TARGETS="vmlinux modules"
|
2021-11-16 12:10:06 +08:00
|
|
|
|
2024-03-02 00:18:20 +08:00
|
|
|
if [[ "$DISTRO" = fedora ]] || [[ "$DISTRO" = rhel ]] || [[ "$DISTRO" = ol ]] ||
|
|
|
|
|
[[ "$DISTRO" = centos ]] || [[ "$DISTRO" = openEuler ]] ||
|
|
|
|
|
@@ -1150,7 +1161,7 @@ if [[ -n "$CONFIG_CC_IS_CLANG" ]]; then
|
2021-11-16 12:10:06 +08:00
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [[ "$SKIPCOMPILERCHECK" -eq 0 ]]; then
|
|
|
|
|
- if [[ -n "$OOT_MODULE" ]]; then
|
|
|
|
|
+ if [[ -n "$OOT_MODULE" ]] && [[ "$OOT_MODULE" != "yes" ]]; then
|
|
|
|
|
target="$OOT_MODULE"
|
|
|
|
|
else
|
|
|
|
|
target="$VMLINUX"
|
2024-03-02 00:18:20 +08:00
|
|
|
@@ -1211,10 +1222,16 @@ fi
|
2021-11-16 12:10:06 +08:00
|
|
|
|
|
|
|
|
# $TARGETS used as list, no quotes.
|
|
|
|
|
# shellcheck disable=SC2086
|
|
|
|
|
-make "${MAKEVARS[@]}" "-j$CPUS" $TARGETS 2>&1 | logger || die
|
|
|
|
|
+if [[ -z "$USERMODBUILDDIR" ]]; then
|
|
|
|
|
+ make "${MAKEVARS[@]}" "-j$CPUS" $TARGETS 2>&1 | logger || die
|
|
|
|
|
+else
|
|
|
|
|
+ make "${MAKEVARS[@]}" -C "$USERMODBUILDDIR" M="$USERMODBUILDDIR" $USERMODFLAGS "-j$CPUS" $TARGETS 2>&1 | logger || die
|
|
|
|
|
+fi
|
|
|
|
|
|
|
|
|
|
# Save original module symvers
|
2023-01-30 16:10:43 +08:00
|
|
|
-cp -f "$BUILDDIR/Module.symvers" "$TEMPDIR/Module.symvers" || die
|
2021-11-16 12:10:06 +08:00
|
|
|
+if [[ "$OOT_MODULE" != "yes" ]]; then
|
2023-01-30 16:10:43 +08:00
|
|
|
+ cp -f "$BUILDDIR/Module.symvers" "$TEMPDIR/Module.symvers" || die
|
2021-11-16 12:10:06 +08:00
|
|
|
+fi
|
|
|
|
|
|
|
|
|
|
echo "Building patched source"
|
|
|
|
|
apply_patches
|
2024-03-02 00:18:20 +08:00
|
|
|
@@ -1224,7 +1241,12 @@ export KPATCH_GCC_SRCDIR="$BUILDDIR"
|
2021-11-16 12:10:06 +08:00
|
|
|
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 [[ -z "$USERMODBUILDDIR" ]]; then
|
|
|
|
|
+ KBUILD_MODPOST_WARN=1 make "${MAKEVARS[@]}" "-j$CPUS" $TARGETS 2>&1 | logger || die
|
|
|
|
|
+else
|
|
|
|
|
+ KBUILD_MODPOST_WARN=1 make "${MAKEVARS[@]}" -C "$USERMODBUILDDIR" M="$USERMODBUILDDIR" $USERMODFLAGS "-j$CPUS" $TARGETS 2>&1 | logger || die
|
|
|
|
|
+fi
|
|
|
|
|
|
|
|
|
|
# source.c:(.section+0xFF): undefined reference to `symbol'
|
|
|
|
|
grep "undefined reference" "$LOGFILE" | sed -r "s/^.*\`(.*)'$/\\1/" \
|
2024-03-02 00:18:20 +08:00
|
|
|
@@ -1239,7 +1261,7 @@ fi
|
2021-11-16 12:10:06 +08:00
|
|
|
|
2023-01-30 16:10:43 +08:00
|
|
|
grep -q vmlinux "$KERNEL_SRCDIR/Module.symvers" || die "truncated $KERNEL_SRCDIR/Module.symvers file"
|
2021-11-16 12:10:06 +08:00
|
|
|
|
2023-01-30 16:10:43 +08:00
|
|
|
-if [[ -n "$CONFIG_MODVERSIONS" ]]; then
|
|
|
|
|
+if [[ -n "$CONFIG_MODVERSIONS" ]] && [[ "$OOT_MODULE" != "yes" ]]; then
|
|
|
|
|
trace_off "reading Module.symvers"
|
|
|
|
|
while read -ra sym_line; do
|
|
|
|
|
if [[ ${#sym_line[@]} -lt 4 ]]; then
|
2024-03-02 00:18:20 +08:00
|
|
|
@@ -1269,7 +1291,11 @@ fi
|
2021-11-16 12:10:06 +08:00
|
|
|
for i in $(cat "$TEMPDIR/changed_objs")
|
|
|
|
|
do
|
|
|
|
|
mkdir -p "$TEMPDIR/patched/$(dirname "$i")" || die
|
2023-01-30 16:10:43 +08:00
|
|
|
- cp -f "$BUILDDIR/$i" "$TEMPDIR/patched/$i" || die
|
2021-11-16 12:10:06 +08:00
|
|
|
+ if [ -z "$USERMODBUILDDIR" ];then
|
2023-01-30 16:10:43 +08:00
|
|
|
+ cp -f "$BUILDDIR/$i" "$TEMPDIR/patched/$i" || die
|
2021-11-16 12:10:06 +08:00
|
|
|
+ else
|
|
|
|
|
+ cp -f "$i" "$TEMPDIR/patched/$i" || die
|
|
|
|
|
+ fi
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
echo "Extracting new and modified ELF sections"
|
2024-03-02 00:18:20 +08:00
|
|
|
@@ -1303,7 +1329,7 @@ CHANGED=0
|
2021-11-16 12:10:06 +08:00
|
|
|
ERROR=0
|
|
|
|
|
|
|
|
|
|
# Prepare OOT module symvers file
|
|
|
|
|
-if [[ -n "$OOT_MODULE" ]]; then
|
|
|
|
|
+if [[ -n "$OOT_MODULE" ]] && [[ "$OOT_MODULE" != "yes" ]]; then
|
2023-01-30 16:10:43 +08:00
|
|
|
cp -f "$OOT_MODULE_SRCDIR/Module.symvers" "$TEMPDIR/Module.symvers" || die
|
|
|
|
|
awk '{ print $1 "\t" $2 "\t" $3 "\t" $4}' "${KERNEL_SRCDIR}/Module.symvers" >> "$TEMPDIR/Module.symvers"
|
|
|
|
|
fi
|
2024-03-02 00:18:20 +08:00
|
|
|
@@ -1322,7 +1348,7 @@ for i in $FILES; do
|
|
|
|
|
find_kobj "$i"
|
|
|
|
|
cd "$TEMPDIR" || die
|
|
|
|
|
if [[ -e "orig/$i" ]]; then
|
|
|
|
|
- if [[ -n $OOT_MODULE ]]; then
|
|
|
|
|
+ if [[ -n $OOT_MODULE ]] && [[ "$OOT_MODULE" != "yes" ]]; then
|
|
|
|
|
KOBJFILE_NAME="$(basename --suffix=.ko "$OOT_MODULE")"
|
|
|
|
|
KOBJFILE_NAME="${KOBJFILE_NAME//-/_}"
|
|
|
|
|
KOBJFILE_PATH="$OOT_MODULE"
|
|
|
|
|
@@ -1339,6 +1365,14 @@ for i in $FILES; do
|
2021-11-16 12:10:06 +08:00
|
|
|
KOBJFILE_PATH="${TEMPDIR}/module/$KOBJFILE"
|
|
|
|
|
SYMTAB="${KOBJFILE_PATH}.symtab"
|
2023-01-30 16:10:43 +08:00
|
|
|
SYMVERS_FILE="$BUILDDIR/Module.symvers"
|
2021-11-16 12:10:06 +08:00
|
|
|
+
|
|
|
|
|
+ if [ "$OOT_MODULE" == "yes" ];then
|
2024-03-02 00:18:20 +08:00
|
|
|
+ MODBUILDDIR="/lib/modules/$ARCHVERSION/build/"
|
2021-11-16 12:10:06 +08:00
|
|
|
+ SYMVERS_FILE="$TEMPDIR/Module.symvers"
|
2023-01-30 16:10:43 +08:00
|
|
|
+ [[ -e $BUILDDIR/Module.symvers ]] && cp "$BUILDDIR/Module.symvers" "$SYMVERS_FILE"
|
2021-11-16 12:10:06 +08:00
|
|
|
+ [[ -e $USERMODBUILDDIR/Module.symvers ]] && cp "$USERMODBUILDDIR/Module.symvers" $SYMVERS_FILE
|
2024-03-02 00:18:20 +08:00
|
|
|
+ awk '{ print $1 "\t" $2 "\t" $3 "\t" $4}' "${MODBUILDDIR}/Module.symvers" >> "$SYMVERS_FILE"
|
2021-11-16 12:10:06 +08:00
|
|
|
+ fi
|
|
|
|
|
fi
|
|
|
|
|
|
2023-01-30 16:10:43 +08:00
|
|
|
"$READELF" -s --wide "$KOBJFILE_PATH" > "$SYMTAB"
|
2024-03-02 00:18:20 +08:00
|
|
|
@@ -1487,7 +1521,7 @@ fi
|
2021-11-16 12:10:06 +08:00
|
|
|
# column containing lines unique to first file.
|
|
|
|
|
UNDEFINED=$(comm -23 <(sort -u "${TEMPDIR}"/undefined_references) \
|
|
|
|
|
<(sort -u "${TEMPDIR}"/new_symbols) | tr '\n' ' ')
|
|
|
|
|
-[[ -n "$UNDEFINED" ]] && die "Undefined symbols: $UNDEFINED"
|
|
|
|
|
+[[ -z "$USERMODBUILDDIR" ]] && [[ -n "$UNDEFINED" ]] && die "Undefined symbols: $UNDEFINED"
|
|
|
|
|
|
|
|
|
|
cp -f "$TEMPDIR/patch/$MODNAME.ko" "$BASE" || die
|
|
|
|
|
|
|
|
|
|
diff --git a/kpatch-build/kpatch-cc b/kpatch-build/kpatch-cc
|
2024-03-02 00:18:20 +08:00
|
|
|
index 17aae25..ce72e55 100755
|
2021-11-16 12:10:06 +08:00
|
|
|
--- a/kpatch-build/kpatch-cc
|
|
|
|
|
+++ b/kpatch-build/kpatch-cc
|
|
|
|
|
@@ -24,7 +24,9 @@ if [[ "$TOOLCHAINCMD" =~ ^(.*-)?gcc$ || "$TOOLCHAINCMD" =~ ^(.*-)?clang$ ]] ; th
|
|
|
|
|
|
|
|
|
|
[[ "$obj" = */.tmp_*.o ]] && obj="${obj/.tmp_/}"
|
2024-03-02 00:18:20 +08:00
|
|
|
relobj=${obj##"$KPATCH_GCC_SRCDIR"/}
|
2021-11-16 12:10:06 +08:00
|
|
|
- case "$relobj" in
|
|
|
|
|
+ tmpobj=$(readlink -f $obj)
|
2024-03-02 00:18:20 +08:00
|
|
|
+ relobj2=${tmpobj##"$KPATCH_GCC_SRCDIR"/}
|
2021-11-16 12:10:06 +08:00
|
|
|
+ case "$relobj2" in
|
|
|
|
|
*.mod.o|\
|
|
|
|
|
*built-in.o|\
|
|
|
|
|
*built-in.a|\
|
|
|
|
|
--
|
2023-01-30 16:10:43 +08:00
|
|
|
2.33.0
|
2021-11-16 12:10:06 +08:00
|
|
|
|